如何设置Ninject单身人士

我有一个类( MyFacade ),我用Ninject注入参数:

 class MyFacade { IDemoInterface demo; public MyFacade(IDemoInterface demo) { this.demo = demo; } public void MyMethod() { Console.WriteLine(demo.GetInfo()); } } 

当然,我必须设置Ninject以注入我的参数的适当实现( IDemoInterface

我知道,我可以通过kernel.Get();来实例化MyFacade对象kernel.Get(); 没有设置别的东西。 目前我的门面没有接口(因为它是我唯一的实现,也许我会为标准建议添加其接口)

如果我想制作这个外观singlenton,我知道两种方法:创建一个空构造函数并通过执行此kernel.Get();传递参数kernel.Get(); 或者通过设置Ninject,如: kernel.Bind().To().InSingletonScope();

第二个看起来更好的方法,但你知道以单一方式设置它的任何其他方法吗?

设置绑定时,需要绑定依赖项。 在绑定中设置依赖项总是更好,而不是在构造函数中执行kernel.Get() 。 您正在使用IOC,因此请利用您正在使用的框架为您进行注射。

在第二个示例绑定中,您缺少的是IDemoInterface中的IDemoInterface 。 您的绑定应如下所示:

 //bind the dependency to the implementation. kernel.Bind().To(); //since you bound your dependency, ninject should now have // all the dependencies required to instantiate your `MyFacade` object. kernel.Bind.To().InSingletonScope(); 

如果您不希望容器通过使用InSingletonScope()来管理单例的生命周期,但仍希望它被注入,我可以考虑两种方法来实现它。 选择哪一种更适合您的需求。 考虑以下ISingleton (命名您的接口)实现:

 public class ConcreteSingleton : ISingleton { private static readonly Lazy _instance = new Lazy(() => new ConcreteSingleton()); private ConcreteSingleton() { } public static ConcreteSingleton Instance { get { return _instance.Value; } } } 
  1. 改变单例类以获得 GetInstance(...) 方法

    在这个方法(我的首选方法)中,你不会每次都调用kernel.Inject(instance) ,只是第一次初始化单例。 将以下方法添加到ConcreteSingleton类:

     public static ConcreteSingleton GetInstance(IKernel kernelForInjection) { if (_instance.IsValueCreated == false) { kernelForInjection.Inject(_instance.Value); } return _instance.Value; } 

    并使用此绑定:

     kernel.Bind().ToMethod(c => ConcreteSingleton.GetInstance(c.Kernel)); 

    将实现没有公共构造函数但是能够有效注入外观的所需行为。

  2. 每次 请求 ISingleton 实例 时执行注入

    如果由于任何原因您不允许修改您的ConcreteSingleton :此方法将单例创建包装在提供程序中,以便仅在第一次创建时有效地注入实例。 重要的是要注意提供者本身必须注册为单身人士。

     internal class ConcreteSingletonProvider : Provider { public IKernel Kernel { get; set; } //Just a wrapper private readonly Lazy _lazy = new Lazy(() => ConcreteSingleton.Instance); public ConcreteSingletonProvider(IKernel kernel) { Kernel = kernel; } protected override ISingleton CreateInstance(IContext context) { if (_lazy.IsValueCreated == false) { Kernel.Inject(ConcreteSingleton.Instance); } return _lazy.Value; } } 

    你的绑定应该是这样的:

     kernel.Bind().ToProvider(); kernel.Bind().ToSelf().InSingletonScope(); 

    这个要点有上述方法的完整工作样本。

希望有所帮助!