我开始在这个相对较小的项目上使用 Ninject,但我遇到了一个问题:我有这个类
class SomeService : ISomeService
这取决于
class BizLogicModule : IBizLogicModule
这又取决于
class DataRepository : IDataRepository
DataRepository
的构造函数如下所示:
DataRepository(BizEntityModel context)
现在,我需要能够跨多个 IDataRepository
实例使用单个 BizEntityModel
实例。
我还需要在IBizLogicModule
的生命周期内创建IDataRepository
。 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>)
非常感谢您的指导
编辑:感谢您的回答!
这里有一些被请求的更多数据:
BizEntityModel
已向 Ninject 注册(代码已更新)。
如果我理解正确:我可以使用“工厂方法”在 IBizLogicModule
中创建 IDataRepository
的实例。但这给我留下了:
1) 我需要将 BizEntityModel
传递给工厂方法,有时是全新的,有时是现有实例。使用工厂方法,每次都会创建一个新的。
2) 这是不是 SomeService
在另一个程序集中的问题,只有它有对 Ninject.dll 的引用?
最佳答案
我像我理解的那样重复这个问题:
每个 BizLogicModule 实例只存在一个 BizEntityModel 实例(它们没有相互引用)
每当 BizLogicModule 创建 DataRepository 时,都会重用此 BizEntityModel
有几个BizLogicModule
如果这是正确的,则 NamedScope 扩展文档中的第二个示例应该适合您。参见 https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope
确保您阅读了此扩展的完整文档:https://github.com/ninject/ninject.extensions.namedscope/wiki
关于c# - 如何将 IoC 容器保持在一个地方,而内部类需要在 bee 构造后创建依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5489489/