DryIoc:不同工厂的不同依赖
DryIoc: Different Dependency from different Factory by Condition
我试过这样的事情:
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而忽略了条件。我简化了代码并替换了配置中的名称(是的,服务-类 已注册)。
更好的条件和 RequestInfo 文档会更好。
编辑:我现在假设,问题是我默认注册了一个工厂,而 DryIoc 只使用了最后一个。
EDIT2:RequestInfo 的确切含义是什么?被请求的人?所以这意味着已配置?还是RequestInfo.Parent配置了?什么是枚举?整个依赖树?
可能是和实例工厂一起使用的condition的bug。需要时间去了解一下。
目前的解决方法 (DryIoc 2.12.5) 将 asResolutionCall: true
添加到有条件的设置中。实际上它不应该是必需的,DryIoc 应该在幕后自动执行此操作以防止缓存第一个条件结果。这就是为什么它可能是一个错误。
这里是 working sample from the 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"))));
我试过这样的事情:
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而忽略了条件。我简化了代码并替换了配置中的名称(是的,服务-类 已注册)。
更好的条件和 RequestInfo 文档会更好。
编辑:我现在假设,问题是我默认注册了一个工厂,而 DryIoc 只使用了最后一个。
EDIT2:RequestInfo 的确切含义是什么?被请求的人?所以这意味着已配置?还是RequestInfo.Parent配置了?什么是枚举?整个依赖树?
可能是和实例工厂一起使用的condition的bug。需要时间去了解一下。
目前的解决方法 (DryIoc 2.12.5) 将 asResolutionCall: true
添加到有条件的设置中。实际上它不应该是必需的,DryIoc 应该在幕后自动执行此操作以防止缓存第一个条件结果。这就是为什么它可能是一个错误。
这里是 working sample from the 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"))));