【发布时间】:2012-02-13 18:11:27
【问题描述】:
现在我有一些服务定义在不依赖于 IoC 容器的程序集中(在我的例子中是 Ninject)。在主项目中,我有一个 IRepository 用于在容器中注册的数据访问。
this.Bind<IRepository>().To<EntityFrameworkRepository<MyDatabaseEntities>>();
我还注册了 IAuthenticationService 和 IErrorLogger 服务,我希望将存储库用于其逻辑的具体实现。但是,我不确定如何最好地做到这一点。目前,我在两个具体实现上的构造函数都采用 IRepository 参数,并在注册它们时将其传入:
this.Bind<IAuthenticationService>().To<MyAuthenticationService>().
WithConstructorArgument("myRepository", ctx => ctx.Kernel.Get<IRepository());
这里我只是告诉容器抓取 IRepository 实例并将其传递给构造函数。
我觉得让我的服务程序集依赖于 ninject 甚至是通用服务定位器 (CSL) 是不对的,但我也不确定我目前的方式。我正在寻找意见和替代解决方案。
如果我的其他服务不使用 IRepository,我将不得不为每种类型的底层 IRepository 类型创建这些服务的新具体实现(例如,用于假数据和真实数据的 AuthenticationService)。这将是大量的逻辑重复。
【问题讨论】:
标签: c# asp.net-mvc dependency-injection inversion-of-control ninject