2011-10-20 41 views
0

我已經在我的統一容器中註冊了一個具體類,我想稍後註冊一個接口,該接口可以連接到該類但使用現有的註冊。統一註冊:連接到預先註冊的具體類的接口

我可以使用下面的代碼做到這一點,但它會導致在註冊時下決心......

container.RegisterInstance<IMyClass>(container.Resolve<MyClass>()); 

是否有可能在某點完成的所有決議,鉤碼起來的接口解決?

回答

2

訣竅是使用InjectionFactory

container.Register<IMyClass>(
    new InjectionFactory(c => c.Resolve<MyClass>())); 
0

這聽起來像你想創建一個工廠類型。在這裏,一個Func委託類型來避免新的自定義工廠類型的創建:

container.RegisterInstance<Func<IMyClass>>(() => container.Resolve<MyClass>()); 

你的其他類型的可再承擔這個廠的依賴:

private IMyClass myClass; 

public MyOtherType(Func<IMyClass> myClassFactory) 
{ 
    this.myClass = myClassFactory(); 
} 
+0

嘿,謝謝你的迴應。不幸的是,這不是我需要的工廠類型。我有具有IMyClass接口作爲構造函數參數的類。我希望這在使用類的時候解析到(已經註冊的)MyClass,而不是在註冊點。如果具體類沒有預先註冊並且我控制了註冊,那麼就不會有問題,因爲我可以在IMyClass的RegisterType方法中爲具體類編寫註冊碼。 – Noob

+0

也許我錯過了一些東西,但是這種方法不行嗎?即當你需要一個IMyClass的實例時,你可以調用工廠方法,該方法在調用時從容器中完成解析,並且將返回IMyClass在該點註冊的任何實例? – devdigital

+0

我不想強迫使用此界面的任何人使用Func 。如果這不是一個限制,那麼你的建議就會起作用。 :-) – Noob

0
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"); 
} 

這版畫「等於」。這是我首先註冊實例的方式。

在上面的評論中,您意味着您不控制初始註冊。這是真正的問題。我會建議下去以下路徑之一(按優先順序,從最高到最低):

  • 創建你自己的UnityContainer獨立的預註冊一個
  • 與CreateChildContainer
  • 創建一個子容器使用已命名的(非默認)映射