Ninject如何配置实现每次Get<>调用返回指定依赖项的非共享实例
默认绑定的实例返回规则
你当前使用的无作用域指定的绑定写法:
kernel.Bind<IMyDependency>().To<MyDependencyImplementation>();
在Ninject中默认采用*瞬态(Transient)*作用域,单个应用域内多次调用kernel.Get<IMyDependency>()时,默认就会每次返回全新的独立实例,不会共享实例。只有当你显式为绑定配置了.InSingletonScope()、.InThreadScope()等共享类作用域时,才会返回同一个实例。
显式配置每次返回全新非共享实例的方法
如果需要强制针对该依赖项生效每次调用Get<>都返回独立实例的规则,可以在绑定时显式声明瞬态作用域,代码如下:
kernel.Bind<IMyDependency>().To<MyDependencyImplementation>().InTransientScope();
配置完成后,Ninject每次收到IMyDependency类型的实例解析请求时,都会创建一个全新的MyDependencyImplementation实例返回,不同调用拿到的实例完全隔离,可临时规避该依赖项的线程安全问题。
注意:该配置仅作用于
IMyDependency本身的实例,如果MyDependencyImplementation内部依赖的其他服务配置了共享作用域,这些嵌套依赖仍为共享实例,若嵌套依赖也存在线程安全问题,需要对应调整它们的作用域配置。
内容的提问来源于stack exchange,提问作者fahadash
相关产品推荐
相关产品推荐

