【发布时间】:2013-08-23 22:03:19
【问题描述】:
假设我有以下接口和类:
public interface IMyService
{
void DoSomething();
}
public class MagicInterfaceImplementor<T>
{
public T GetImplementation()
{
// Not relevant.
}
}
获取IMyService 实例的唯一方法是通过MagicInterfaceImplementor<IMyService>。我显然可以很容易地为MagicInterfaceImplementor<IMyService> 设置注入:
Bind<MagicInterfaceImplementor<IMyService>().ToSelf();
[严格地说,在这个特定的例子中这不是必需的,但在实际情况下我对绑定做了更多的事情。]
我的问题是 - 我如何绑定IMyService?
我想我可以做到这一点,但我不确定这是不是最好的方法,因为我明确地调用了内核,这通常是不受欢迎的:
Bind<IMyService>().ToMethod(context => {
return ((MagicInterfaceImplementor<IMyService>)
context.Kernel.GetService(typeof(MagicInterfaceImplementor<IMyService>)))
.GetImplementation();
});
任何关于更合适的方法的建议将不胜感激。
【问题讨论】:
-
ninject 是否支持 lambda 解析?是这样吗,您可以尝试使用 Ninject 等效的 'Register
(() => new MagicInterfaceImplementor ().GetImplementation()).AsSingleton()` 或您选择的生命周期模型。 -
@Alex:在完整的情况下,我实际上是在为 Magic 类进行绑定以分配构造函数参数。如果我使用
new,我需要提供两次参数。 (这很好,因为它们都在同一个地方,并且在进行任何更改时都会很明显 - 我只是希望能够重用已经设置的内容。) -
也许它支持一个 lambda,它将容器/解析器作为 agrment 提供,如:Register
((container) => container.Resolve >()。 GetImplementation()).AsSingleton()` -
@Alex:这基本上就是我在示例中的内容。 :)
-
对如此简单的事情的难以理解的 Ninject 语法大笑。虽然里面有
typeof,但并不是真正的lamda。