public interface Iquery<in TIn,out TOut>{ IReadonlyCollection<TOut> Get(TIn key);}
和服务
public class FakeRepository : Iquery<object,string>{ public IReadonlyCollection<string> Get(object key) { return new[] { key.ToString() }; }}
纯DI工作正常
Iquery<string,object> service = new FakeRepository();
但是autofac和DryIoc都无法解决它.
service = autofacContainer.Resolve<Iquery<string,object>>(); // exceptionservice = dryIocContainer.Resolve<Iquery<string,object>>(); // exception
我需要一些额外的设置吗?有没有其他IoC容器支持这个?我问得太多了吗?
完整代码:https://dotnetfiddle.net/vlw17R
解决方法 它不适用于当前的DryIoc版本(稳定的v2.12.6和预览v3.0.0-prevIEw-03).但理论上没有任何东西可以阻止使用封闭或非泛型实现类型注册开放式通用服务类型.
对于单一服务到实施注册:
container.Register(typeof(Iquery<,>),typeof(FakeRepository));
由于对已实现类型的内部检查,DryIoc将抛出异常.如果我将检查调整为包含开放式通用版本的服务类型,则可以:
container.Resolve<Iquery<string,object>>();
可以进行类似的调整以在RegisterMany中包括开放通用服务类型.
但剩下的问题将是ResolveMany.它是一个实现细节,但是在解析集合时,同时具有封闭式和开放式通用版本的服务可能会产生两个实例.
最后,我在DryIoc跟踪器中创建了an issue,并将考虑如何以安全的方式启用它.
更新
新的DryIoc v2.12.7与Register一起发布,能够注册开放式通用服务类型.但不是RegisterMany.有关详细信息,请查看issue.
总结以上是内存溢出为你收集整理的c# – IoC容器的协变服务解析全部内容,希望文章能够帮你解决c# – IoC容器的协变服务解析所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)