C# 将接口绑定到另一个绑定结果的最佳方法

C# 将接口绑定到另一个绑定结果的最佳方法,c#,ninject,C#,Ninject,假设我有以下接口和类: public interface IMyService { void DoSomething(); } public class MagicInterfaceImplementor<T> { public T GetImplementation() { // Not relevant. } } [严格地说,这在这个特定的实例中是不必要的,但我在实际案例中对绑定做了更多的工作。] 我的问题是-如何绑定IMySe

假设我有以下接口和类:

public interface IMyService
{
    void DoSomething();
}

public class MagicInterfaceImplementor<T>
{
    public T GetImplementation()
    {
        // Not relevant.
    }
}
[严格地说,这在这个特定的实例中是不必要的,但我在实际案例中对绑定做了更多的工作。]

我的问题是-如何绑定
IMyService

我想我可以做到这一点,但我不确定这是否是最好的方法,因为我显式地调用内核,这通常是不赞成的:

Bind<IMyService>().ToMethod(context => {
    return ((MagicInterfaceImplementor<IMyService>)
            context.Kernel.GetService(typeof(MagicInterfaceImplementor<IMyService>)))
                .GetImplementation();
});
Bind().ToMethod(上下文=>{
返回((MagicInterfaceImplementor)
GetService(typeof(MagicInterfaceImplementor)))
.GetImplementation();
});

如果您能提出任何更合适的建议,我们将不胜感激。

也许MagicImplementor的具体工作会很有趣。所以这更多的是猜测,但也许一个提供者可以帮助你

否则你可以简单地写

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

ninject是否支持lambda分辨率?如果确实如此,您可以尝试“Register(()=>new MagicInterfaceImplementor().GetImplementation()).AsSingleton()”的Ninject等价物或您选择的生命周期模型。@Alex:在整个案例中,我实际上是在为Magic类进行绑定,以便分配构造函数参数。如果使用
new
,则需要提供两次参数。(这很好,因为它们都在同一个位置,并且在进行任何更改时都会很明显-我只是希望能够重用已经设置好的内容。)也许它支持一个lambda,该lambda可以将容器/解析器作为agroment提供,如:Register((container)=>container.Resolve().GetImplementation()).AsSingleton()`@亚历克斯:这基本上就是我在例子中所说的对于这么简单的东西,你会对难以理解的Ninject语法哈哈大笑。不是一个真正的lamda,但是里面有
类型的
。我似乎没有.Get方法。这是一个扩展方法。也许这就是你看不到的原因。谢谢!那要干净得多。而且,既然没有更好的答案,我很乐意选择一个更干净的。
Bind<IMyService>().ToMethod(ctx => ctx.Kernel.Get<MagicInterfaceImplementor<IMyService>>().GetImplementation());