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