unity container - container - Unity將兩個接口註冊為一個單例



unity-container (3)

[編輯]

可以在here找到通過XML配置執行此操作的解決方案。 基於該答案,我建議採用簡化的僅代碼方法,如下所示:

_container.RegisterType<IEventService, EventService>(new ContainerControlledLifetimeManager());
_container.RegisterType<IEventServiceInformation, EventService>(new ContainerControlledLifetimeManager());
bool singleton = ReferenceEquals(_container.Resolve<IEventService>(), _container.Resolve<IEventServiceInformation>());

這樣,容器不會發布EventService類本身。 由於該類應被視為實現細節,因此這是更好的方法。

[原始答案]

有點遲到的答案,但應該做的訣竅:

_container.RegisterType<EventService>(new ContainerControlledLifetimeManager());
_container.RegisterType<IEventService, EventService>();
_container.RegisterType<IEventServiceInformation, EventService>();

bool singleton = ReferenceEquals(_container.Resolve<IEventService>(), _container.Resolve<IEventServiceInformation>());

如何在Unity中使用相同的實例註冊兩個不同的接口...目前我正在使用

        _container.RegisterType<EventService, EventService>(new ContainerControlledLifetimeManager());
        _container.RegisterInstance<IEventService>(_container.Resolve<EventService>());
        _container.RegisterInstance<IEventServiceInformation>(_container.Resolve<EventService>());

哪個有效,但看起來不太好..

所以,我認為你明白了。 EventService實現了兩個接口,如果我解析接口,我想要對同一個對象的引用。

克里斯


Answer #1

編輯

在評論中得到一些反饋後,我認為Sven的答案是一個非常優秀的答案。 感謝Chris Tavares指出技術優點。

這幾乎是唯一的方法。

你可以稍微修改它(我討厭每個泛型參數的RegisterType類型相同):

EventService es = _container.Resolve<EventService>();
_container.RegisterInstance<IEventService>(es);
_container.RegisterInstance<IEventServiceInformation>(es);

如果您的一個或多個IoC子項要請求具體的EventService類型(希望不是),您將再添加一個RegisterInstance類型為RegisterInstance<EventService> 。 希望您不需要它,並且所有依賴對像都要求IEventService ,而不是EventService

希望這有幫助,安德森


Answer #2

對於這麼簡單的事情,適配器方法似乎很笨重,所以我看得更遠一點。 要解決命名實例的問題,您需要註冊類型,並註冊接口的工廠。

 InjectionFactory factory = new InjectionFactory(x => x.Resolve<SimulationService>());
 this.Container.RegisterType<SimulationService>(new ContainerControlledLifetimeManager());
 this.Container.RegisterType<IContentProvider>("SimulationContentProvider", factory);
 this.Container.RegisterType<ISimulationService>(factory);

這樣您就不需要創建具體類的實例(在註冊時),由於缺少依賴性,這在我的情況下是不可能的。