0

有接口...在Castle Windsor中,如何註冊泛型接口的許多實現中的一個實現泛型類型的實現?

IThing 
IWrapping<IThing> 

...通過Things實現...

Cookie : IThing 
Carmel : IThing 
Chocolate : IThing 

...和Wrappings他們...

Paper <TThing> : IWrapping<TThing> where TThing is IThing 
Foil <TThing> : IWrapping<TThing> where TThing is IThing 

...我選擇一個實現Wrapping來運行該應用程序,忽略其他。要註冊選擇了所有已知的IThing實現我現在必須列出所有這些Wrapping

Component.For<IWrapping<Cookie>>() .ImplementedBy<Paper<Cookie>>(), 
Component.For<IWrapping<Carmel>>() .ImplementedBy<Paper<Carmel>>(), 
Component.For<IWrapping<Chocolate>>().ImplementedBy<Paper<Chocolate>>(), 

怎樣一個寄存器所有的人都在一次?

Component.For<IWrapping<IThing>>() 
    .ImplementedBy<Paper<ALL_FOUND_IMPLEMENTATIONS_OF_ITHING>>(), // One place to switch between Paper and Foil 

回答

0

因爲您正在處理Castle內的泛型類型參數,所以不能像使用它一樣使用流暢的語法。

你可以做的是下面的一行:

container.Register(Component.For(typeof(IWrapping<>)).ImplementedBy(typeof(Paper<>))); 
var cookieWrapper = container.Resolve<IWrapping<Cookie>>(); 

在解決的依賴,你會得到以下結果:

Screenshot of the result upon resolving the wrapper

這是基於以下對象依賴關係設置(我反映了你在帖子中的內容,但只是想確保你能夠完整地瞭解我所做的重現此操作的全貌):

public interface IThing {} 
public interface IWrapping<IThing> {} 
public class Paper<TThing> : IWrapping<TThing> where TThing : IThing {} 
public class Cookie : IThing {} 
public class Carmel : IThing{} 
public class Chocolate : IThing{}