簡體   English   中英

Castle windsor解決了具有開放式通用和接口的陣列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM