我已經在我的統一容器中註冊了一個具體類,我想稍後註冊一個接口,該接口可以連接到該類但使用現有的註冊。統一註冊:連接到預先註冊的具體類的接口
我可以使用下面的代碼做到這一點,但它會導致在註冊時下決心......
container.RegisterInstance<IMyClass>(container.Resolve<MyClass>());
是否有可能在某點完成的所有決議,鉤碼起來的接口解決?
我已經在我的統一容器中註冊了一個具體類,我想稍後註冊一個接口,該接口可以連接到該類但使用現有的註冊。統一註冊:連接到預先註冊的具體類的接口
我可以使用下面的代碼做到這一點,但它會導致在註冊時下決心......
container.RegisterInstance<IMyClass>(container.Resolve<MyClass>());
是否有可能在某點完成的所有決議,鉤碼起來的接口解決?
訣竅是使用InjectionFactory
:
container.Register<IMyClass>(
new InjectionFactory(c => c.Resolve<MyClass>()));
這聽起來像你想創建一個工廠類型。在這裏,一個Func
委託類型來避免新的自定義工廠類型的創建:
container.RegisterInstance<Func<IMyClass>>(() => container.Resolve<MyClass>());
你的其他類型的可再承擔這個廠的依賴:
private IMyClass myClass;
public MyOtherType(Func<IMyClass> myClassFactory)
{
this.myClass = myClassFactory();
}
IUnityContainer container = new UnityContainer();
var onlyInstance = new MyClass();
container.RegisterInstance<IMyClass>(onlyInstance);
IMyClass resolved = container.Resolve<IMyClass>();
if (object.ReferenceEquals(onlyInstance, resolved))
{
Console.WriteLine("Equal");
}
這版畫「等於」。這是我首先註冊實例的方式。
在上面的評論中,您意味着您不控制初始註冊。這是真正的問題。我會建議下去以下路徑之一(按優先順序,從最高到最低):
嘿,謝謝你的迴應。不幸的是,這不是我需要的工廠類型。我有具有IMyClass接口作爲構造函數參數的類。我希望這在使用類的時候解析到(已經註冊的)MyClass,而不是在註冊點。如果具體類沒有預先註冊並且我控制了註冊,那麼就不會有問題,因爲我可以在IMyClass的RegisterType方法中爲具體類編寫註冊碼。 – Noob
也許我錯過了一些東西,但是這種方法不行嗎?即當你需要一個IMyClass的實例時,你可以調用工廠方法,該方法在調用時從容器中完成解析,並且將返回IMyClass在該點註冊的任何實例? – devdigital
我不想強迫使用此界面的任何人使用Func。如果這不是一個限制,那麼你的建議就會起作用。 :-) –
Noob