DryIoc:不同工厂的不同依赖性

时间:2017-11-29 14:58:43

标签: dryioc

我试过这样的事情:

container.Register<IFactory, WebFactory>(
    serviceKey: "t");

container.Register<IConfigurationProvider>(made: Made.Of(
    r => ServiceInfo.Of<IFactory>(serviceKey: "t"), 
    f => f.Create()), setup: Setup.With(condition:
        req => req.Parent.Enumerate().Any(p => 
            p.ServiceType.Namespace.StartsWith("Namespace"))));


container.Register<IFactory, OtherFactory>(
    serviceKey: "c");

container.Register<IConfigurationProvider>(made: Made.Of(
    r => ServiceInfo.Of<IFactory>(serviceKey: "c"), 
    f => f.Create()), setup: Setup.With(condition:
        req => req.Parent.Enumerate().Any(p => 
            p.ServiceType.Namespace.StartsWith("OtherNamespace"))));


container.Register<IFactory, DefaultFactory>();
container.Register<IConfigurationProvider>(made: Made.Of(
    r => ServiceInfo.Of<IFactory>(), f => f.Create()));         
container.Register<IConfigured, Configured>(made: Made.Of(() =>
    new Configured(Arg.Of<IConfigurationProvider>())));


namespace Namespace {
    class MyService {
        MyService(IConfigured configured) {
        }
    }
}


namespace OtherNamespace {
    class MyOtherService {
        MyOtherService(IConfigured configured) {
        }
    }
}

但是DryIoc刚刚注入了IConfigurationProvider的最后一个注册,并忽略了这个条件。我简化了Code代码并替换了配置中的Names(是的,注册了Services-Classes)。

更好的条件文档和RequestInfo会很好。

编辑:我现在假设,问题是我的工厂默认注册,DryIoc只使用最后一个。

EDIT2:究竟代表RequestInfo的是什么?被要求的人?这意味着配置?或者是RequestInfo.Parent配置?什么是枚举?整个依赖树?

1 个答案:

答案 0 :(得分:1)

这可能是与实例工厂一起使用的条件错误。需要时间才能找到答案。

目前的解决方法(DryIoc 2.12.5)将asResolutionCall: true添加到有条件的设置中。实际上它不应该是必需的,DryIoc应该在幕后自动执行,以防止缓存第一个条件结果。这就是为什么它可能是一个错误。

以下是working sample中的comments chat

关于问题中的代码,条件的注册应该像这样修改(为了便于阅读,重新格式化了一点):

container.Register<IConfigurationProvider>(
    made: Made.Of(r => ServiceInfo.Of<IFactory>(serviceKey: "t"), f => f.Create()), 
    setup: Setup.With(asResolutionCall: true,
        condition: r => r.Parent.Enumerate().Any(
             p => p.ServiceType.Namespace.StartsWith("Namespace"))));

container.Register<IConfigurationProvider>(
    made: Made.Of(r => ServiceInfo.Of<IFactory>(serviceKey: "c"), f => f.Create()), 
    setup: Setup.With(asResolutionCall: true,
        condition: r => r.Parent.Enumerate().Any(
             p => p.ServiceType.Namespace.StartsWith("OtherNamespace"))));