我想用温莎城堡解决以下问题:
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类型引入协变通用接口.有关协方差和逆变的更多信息,请访问:Covariance and Contravariance in Generics
所以我建议你介绍以下界面:
public interface IDeFinition<out TEntity> where TEntity : IEntity { }
请注意将关键字标记为协变的out关键字.然后推导出你的定义< 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>));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。