[英]Castle windsor resolve array with open generic and interface
我想用溫莎城堡解決以下問題:
IEnumerable<Definition<IEntity>>
目前我只獲得一個IEnumerable,其中一個對象與IEntity的第一個實現相匹配。
我想要一個陣列
{ Definition<Entity1>, Definition<Entity2>, ... }
我覺得需要一個子解析器,但我不知道從哪里開始。
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(container.Kernel, true));
container.Register(Component.For(typeof (Definition<>)));
var binDir = HostingEnvironment.MapPath("~/bin");
var assemblyFilter = new AssemblyFilter(binDir);
container.Register(Types.FromAssemblyInDirectory(assemblyFilter)
.BasedOn<IEntity>()
.Unless(t => t.IsAbstract || t.IsInterface)
.WithServiceAllInterfaces()
.LifestyleTransient());
// This doesn't work!
var items = container.Resolve(typeof(IEnumerable<Definition<IEntity>>));
首先,我認為你應該改進你的設計。 我不知道實際情況,但我相信你的意圖如下:
public interface IEntity
{
}
public class Entity1 : IEntity
{
}
public class Entity2 : IEntity
{
}
public abstract class Definition<TEntity>
where TEntity : IEntity
{
}
public class Entity1Definition : Definition<Entity1>
{
}
public class Entity2Definition : Definition<Entity2>
{
}
使用此設計,您會遇到以下代碼無效的問題:
Definition<IEntity> definition = new Entity1Definition();
為了使其工作,您應該為IEntity類型引入協變通用接口。 有關協方差和逆變的更多信息,請參見此處: 泛型中的協方差和逆變
所以我建議你介紹以下界面:
public interface IDefinition<out TEntity>
where TEntity : IEntity
{
}
keyword that marks the interface as covariant. 請注意將關鍵字標記為協變的關鍵字。 然后從此接口派生您的Definition <TEntity> :
public abstract class Definition<TEntity> : IDefinition<TEntity>
where TEntity : IEntity
{
}
現在,當我們以這種方式設置設計時,其余部分很容易。 我們可以注冊這樣的組件:
WindsorContainer container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(container.Kernel, true));
container.Register(Types.FromThisAssembly()
.BasedOn(typeof(IDefinition<>))
.Unless(t => t.IsAbstract || t.IsInterface)
.WithServices(typeof(IDefinition<IEntity>))
.LifestyleTransient());
然后解決它們:
var items = container.ResolveAll(typeof(IDefinition<IEntity>));
請注意,要解決Windsor中已注冊服務的所有實例,您應該調用ResolveAll方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.