Men*_*hem 5 c# dependency-injection ioc-container ninject-2
我开始使用Ninject,在这个相对较小的项目上,我遇到了一个问题:我有这个课程
class SomeService : ISomeService
Run Code Online (Sandbox Code Playgroud)
这取决于
class BizLogicModule : IBizLogicModule
Run Code Online (Sandbox Code Playgroud)
而这又取决于
class DataRepository : IDataRepository
Run Code Online (Sandbox Code Playgroud)
在DataRepository有一个构造函数,看起来像:
DataRepository(BizEntityModel context)
Run Code Online (Sandbox Code Playgroud)
现在,我需要能够使用BizEntityModel跨多个实例的单个IDataRepository实例.
我还需要创造IDataRepository一个人的生活IBizLogicModule.我IBizLogicModule不知道Ninject,我想保持这种方式.
所以我的问题是:如何使用Ninject内核连接所有这些,同时:
不必在层周围传递内核实例.
保持代码可读性接近于之前的Ninject(我只是使用工厂方法进行新操作).
到目前为止我接线的简单部分是:
Bind<SomeService>().To<ISomeService>();
Bind<BizLogicModule>().To<IBizLogicModule>();
Bind<DataRepository>().To<IDataRepository>();
Bind<BizEntityModel>().To<BizEntityModel>(); //ToSelf()
// .WithConstructorArgument(context => Kernel.Get<BizEntityModel>)
Run Code Online (Sandbox Code Playgroud)
非常感谢您的指导
编辑:谢谢你的回答!
这里有一些请求的数据:
BizEntityModel在Ninject注册(代码更新).
如果我正确理解:我可以创建的实例IDataRepository中IBizLogicModule使用了"工厂方法".但这让我失望:
1)我需要传递一个BizEntityModel工厂方法,有时候是新的,有时是现有的实例.使用工厂方法,每次都会重新创建一个.
2)这SomeService是另一个程序集中的问题,只有它有一个引用Ninject.dll?
您是否向 Ninject 注册了 BizEntityModel?如果是这样,您应该能够告诉 Ninject 在容器甚至程序的生命周期内为每个请求提供一个且仅一个 BizEntityModel 实例,而无需定义和注册 BizEntityModel 的传统单例实例。即使您必须使用工厂方法,并且 Ninject 不允许您将注册范围设置为单例,但如果您必须这样做,您也可以急切加载该对象,然后将依赖项的实例注册为单例。
IBizLogicModule 永远不必了解 Ninject;Ninject 应该了解 BizLogicModule。尝试创建一个 IDataRepository 注册,该注册将提供一个工厂方法(工厂范围,因此每次调用都会创建一个新实例),然后将该工厂方法作为依赖项传递给 IBizLogicModule,IBizLogicModule 将在需要创建 IDataRepositories 时使用它。您基本上是通过 IoC 的解析功能在 IBizLogicModule 中提供工厂类。如果您对 IBizLogicModule 上的许多不同类类型执行此操作,那么您基本上是在创建一个我个人会避免的服务定位器,但其中一两个是完全有效的工厂/创建者模式。
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |