c# – Castle windsor使用开放式泛型和接口解析数组

c# – Castle windsor使用开放式泛型和接口解析数组,第1张

概述我想用温莎城堡解决以下问题: IEnumerable<Definition<IEntity>> 目前我只获得一个IEnumerable,其中一个对象与IEntity的第一个实现相匹配. 我想要一个阵列 { Definition<Entity1>, Definition<Entity2>, ... } 我觉得需要一个子解析器,但我不知道从哪里开始. 更新 var container = new Wi 我想用温莎城堡解决以下问题:

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>));

请注意,要解决Windsor中已注册服务的所有实例,您应该调用ResolveAll方法.

总结

以上是内存溢出为你收集整理的c# – Castle windsor使用开放式泛型和接口解析数组全部内容,希望文章能够帮你解决c# – Castle windsor使用开放式泛型和接口解析数组所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230112.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存