【问题标题】:Best way to bind an interface to the result of another binding将接口绑定到另一个绑定结果的最佳方法
【发布时间】:2013-08-23 22:03:19
【问题描述】:

假设我有以下接口和类:

public interface IMyService
{
    void DoSomething();
}

public class MagicInterfaceImplementor<T>
{
    public T GetImplementation()
    {
        // Not relevant.
    }
}

获取IMyService 实例的唯一方法是通过MagicInterfaceImplementor&lt;IMyService&gt;。我显然可以很容易地为MagicInterfaceImplementor&lt;IMyService&gt; 设置注入:

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。

标签: c# ninject


【解决方案1】:

也许 MagicImplementor 究竟做了什么会很有趣。所以这更像是一个猜测,但也许提供者可能会帮助你。

https://github.com/ninject/ninject/wiki/Providers,-Factory-Methods-and-the-Activation-Context

否则你可以简单地写

Bind<IMyService>().ToMethod(ctx => ctx.Kernel.Get<MagicInterfaceImplementor<IMyService>>().GetImplementation());

【讨论】:

  • 我好像没有 .Get 方法。
  • 这是一种扩展方法。也许这就是你看不到它的原因。
  • 谢谢!这样干净多了。而且,由于似乎没有更好的答案,我很乐意选择一个更干净的答案。
猜你喜欢
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2011-02-08
  • 2012-04-01
  • 2021-06-01
  • 1970-01-01
  • 2011-03-18
  • 2012-10-19
相关资源
最近更新 更多