7

我在没有任何 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

4

1 回答 1

4

它不适用于当前的 DryIoc 版本(稳定版v2.12.6和预览版v3.0.0-preview-03)。

但是理论上没有什么可以阻止将开放通用服务类型注册为封闭或非通用实现类型。

对于单个服务到实现的注册:

container.Register(typeof(IQuery<,>), typeof(FakeRepository));

DryIoc 会因为实现类型的内部检查而抛出异常。如果我调整检查以包括服务类型的开放通用版本,那么这有效:

container.Resolve<IQuery<string, object>>();

可以进行类似的调整以将开放通用服务类型包括在RegisterMany.

剩下的问题将与ResolveMany. 它是一个实现细节,但是在解析集合时,同时拥有封闭和开放通用版本的服务可能会产生两个实例。

最后,我在 DryIoc 跟踪器中创建了一个问题,并将考虑如何以安全的方式启用它。

更新

新的DryIoc v2.12.7发布,Register能够注册开放通用服务类型。但不是RegisterMany. 检查问题以获取更多详细信息。

于 2018-01-18T11:28:24.093 回答