【发布时间】:2015-01-29 10:26:21
【问题描述】:
我有一个 ninject 问题,我在多种类型上使用相同的接口来为我的应用程序提供配置类。
启动该应用程序的入口点类(如下)是从 ninject 内核返回的,我对该类有一个名为 Config 的依赖项。
public ProcessA(ILogger logger, [Named("TypeA")] IConfigProvider configProvider)
{
_logger = logger;
_configProvider = configProvider;
}
public ProcessB(ILogger logger, [Named("TypeB")] IConfigProvider configProvider)
{
_logger = logger;
_configProvider = configProvider;
}
然后在我的绑定中
Bind<IConfigProvider>().To<ProcessA>().Named("TypeA");
Bind<IConfigProvider>().To<ProcessB>().Named("TypeB");
进一步处理线ProcessA 和ProcessB 共享一些需要IConfigProvider 的类,但是当ProcessA 或ProcessB 到达该点时,ninject 无法解决依赖关系。那时我不能使它成为一个命名依赖项,因为两个处理器都使用这些类。
我可以将具体的Config 类从ProcessA 和ProcessB 传递下来,删除构造函数依赖项,但这似乎不是正确的方法。
编辑 1(来自 BatteryBackupUnit 的回答)
我删除了命名引用并添加了以下似乎可以解决问题的方法。在以下问题 Ninject Bind When Ancestor Of Type T 上找到了一个方法,但我必须添加对 request.Target == null 的检查,否则当我从 ninject 内核获得 ProcessA 和 ProcessB 的实例时它不会工作。
public override void Load()
{
Bind<IConfigProvider>()
.To<TypeAConfigProvider>()
.When(request => HasAncestorOfType<ProcessA>(request));
Bind<IConfigProvider>()
.To<TypeBConfigProvider>()
.When(request => HasAncestorOfType<ProcessB>(request));
}
private static bool HasAncestorOfType<T>(IRequest request)
{
if (request == null || request.Target == null)
return false;
if (request.Target.Member.ReflectedType == typeof(T))
return true;
return HasAncestorOfType<T>(request.ParentRequest);
}
【问题讨论】:
-
我觉得不错。但是你为什么不使用/扩展
WhenAnyAncestorMatches方法呢? -
无法解析方法?!
-
奇怪。不过它应该在那里,例如它用于 ninject 的测试here。
-
我知道,很奇怪。感谢您的帮助。