加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – IoC容器的协变服务解析

发布时间:2020-12-15 07:55:49 所属栏目:百科 来源:网络整理
导读:我正在为我的应用程序使用依赖注入模式而没有任何IoC容器.现在我决定使用一些IoC容器,因为我的Composition Root由数千行代码组成,但我没能使它与我的类一起使用,它们主动使用方差.例如以下界面 public interface IQueryin TIn,out TOut{ IReadOnlyCollection
我正在为我的应用程序使用依赖注入模式而没有任何IoC容器.现在我决定使用一些IoC容器,因为我的Composition Root由数千行代码组成,但我没能使它与我的类一起使用,它们主动使用方差.例如以下界面
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>>(); // exception
service = 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读