将一个类绑定到多个接口作为单例

时间:2010-11-16 14:53:02

标签: c# binding dependency-injection singleton ninject

我有2个interfase IInterface1IInterface2

public interface IInterface1 {...}
public interface IInterface2 {...} 

以及这些接口ImplClass的一个实现。

public class ImplClass : IInterface1, IInterface2 {...}

我必须确保应用程序只有一个ImplClass实例,它将用作IInterface1和IInterface2。 我正在使用ninject进行依赖注入。所以我的问题是:下面的代码是否符合我的要求?

...
Bind<IInterface1>().To<ImplClass>().Using<SingletonBehavior>();
Bind<IInterface2>().To<ImplClass>().Using<SingletonBehavior>();
...

或者此代码将为eash接口创建2个ImplClass实例?

4 个答案:

答案 0 :(得分:20)

使用Ninject,你可以这样做:

var impl = new Impl();
container.Bind<IInt1>().ToMethod(c => impl);
container.Bind<IInt2>().ToMethod(c => impl);

Impl类具有依赖关系时,你无法注入Ninject,你可以这样做:

container.Bind<Impl>().ToSelf().InSingletonScope();
container.Bind<IInt1>().ToMethod(c => c.Kernel.Get<Impl>());
container.Bind<IInt2>().ToMethod(c => c.Kernel.Get<Impl>()); 

很干净。

答案 1 :(得分:5)

看来你还在使用Ninject 1.5。我不再考虑确切的语法了,但它应该与以下2.1语法类似:

kernel.Bind<I1>().ToMethod(ctx => ctx.Kernel.Get<Impl>());
kernel.Bind<I2>().ToMethod(ctx => ctx.Kernel.Get<Impl>()); 
kernel.Bind<Impl>().ToSelf().InSingletonScope();

甚至更好地使用Ninject.Extensions.ContextPreservation来保持上下文。

kernel.Bind<Impl>().ToSelf().InSingletonScope();
kernel.BindInterfaceToBinding<I1, Impl>();
kernel.BindInterfaceToBinding<I2, Impl>();

答案 2 :(得分:3)

这是你可以在一行代码中完成的:

Bind<IInterface1 ,IInterface2 ,ImplClass>().To<ImplClass>().InSingletonScope();

https://github.com/ninject/Ninject.Extensions.ContextPreservation/wiki/BindInterfaceToBinding

它需要Ninject版本3.

答案 3 :(得分:1)

我怀疑这会创建两个实例。

尝试以下构造是否适合您:

public class ImplClass : IInterface1, IInterface2
{
    public static readonly ImplClass Instance = new ImplClass();
}

使用以下绑定:

Bind<IInterface1>().ToMethod(c => ImplClass.Instance);
Bind<IInterface2>().ToMethod(c => ImplClass.Instance);