如何设置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; } } }
-
改变单例类以获得
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)); 将实现没有公共构造函数但是能够有效注入外观的所需行为。
-
每次 请求
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(); 这个要点有上述方法的完整工作样本。
希望有所帮助!