5

我开始在这个相对较小的项目上使用 Ninject 并且遇到了一个问题:我有这个类

class SomeService : ISomeService 

这取决于

class BizLogicModule : IBizLogicModule

这又取决于

class DataRepository : IDataRepository

DataRepository一个看起来像这样的演员:

DataRepository(BizEntityModel context)

现在,我需要能够BizEntityModel跨多个实例使用单个IDataRepository实例。
我还需要创造IDataRepository一个IBizLogicModuleIBizLogicModule不知道 Ninject,我想保持这种状态。

所以我的问题是:如何使用 Ninject 内核连接所有这些,同时:

  1. 不必在层周围传递内核实例。

  2. 使代码的可读性接近于 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 注册(代码已更新)。

如果我理解正确:我可以使用“工厂方法”创建实例IDataRepositoryIBizLogicModule但这给我留下了:
1)我需要将 a 传递BizEntityModel给工厂方法,有时它是全新的,有时它是现有实例。使用工厂方法,每次都会创建一个新的。
2)SomeService是另一个程序集中的问题吗,只有它有一个对 Ninject.dll 的引用?

4

3 回答 3

2

我重复这个问题,就像我理解的那样:

  1. 每个 BizLogicModule 实例恰好存在一个 BizEntityModel 实例(它们之间没有相互引用)

  2. 每当 BizLogicModule 创建 DataRepository 时,都会重用此 BizEntityModel

  3. 有几个 BizLogicModule

如果这是正确的,NamedScope 扩展文档中的第二个示例应该适合您。见https://github.com/ninject/ninject.extensions.namedscope/wiki/InNamedScope

确保您阅读了此扩展的完整文档:https ://github.com/ninject/ninject.extensions.namedscope/wiki

于 2011-03-30T18:16:05.623 回答
1

你用 Ninject 注册 BizEntityModel 吗?如果是这样,您应该能够告诉 Ninject 在容器甚至程序的生命周期内为每个请求提供一个且仅一个 BizEntityModel 实例,而无需定义和注册 BizEntityModel 的传统单例实例。即使您必须使用工厂方法并且 Ninject 不会让您对该注册进行单例作用域,但如果您必须这样做,您可以预先加载对象,然后将依赖项的实例注册为单例。

IBizLogicModule 永远不必了解 Ninject;Ninject 应该知道 BizLogicModule。尝试创建一个 IDataRepository 注册,该注册将提供一个工厂方法(工厂范围内,因此每次调用都会创建一个新实例),然后将该工厂方法作为依赖项传递给 IBizLogicModule,IBizLogicModule 将在需要创建 IDataRepositories 时使用它。您基本上是通过 IoC 的解析功能在 IBizLogicModule 中提供工厂类。如果您在 IBizLogicModule 上为许多不同的类类型执行此操作,那么您基本上是在创建一个我个人会避免的服务定位器,但一两个是完全有效的工厂/创建者模式。

于 2011-03-30T17:04:27.633 回答
0

下面的答案假设您正在询问如何解决IDataRepositoryin one的许多实例IBizLogicModule。否则这个问题太简单了:-)

通常好的 IoC 容器能够注入工厂/工厂方法。我对 NInject 没有太多经验,也没有找到其他容器的最佳解决方案,但在这里您可以看到如何实现主要任务的示例。这里唯一的问题是您必须自己实现一个工厂并将其拉到IResolutionContext那里,但无论如何,这个工厂将允许您将其余代码(IBizLogicModule)与 IoC 细节隔离开,因为它只有IDataRepositoryFactory 依赖关系。

于 2011-03-30T17:27:16.993 回答