如何在依赖项目中使用 Ninject 创建类的新实例?(不在引导项目中)
本文关键字:项目 实例 新实例 依赖 Ninject 创建 | 更新日期: 2023-09-27 18:35:50
我正在做一个具有多层架构的项目。这些层位于其自己的类库项目中,但都位于同一解决方案中。在较低层,我已经有了存储库模式,包括我的模型、存储库和数据库上下文。在我的存储库之上有一个服务层,其中包含我的所有业务逻辑。现在,在我的单元测试中,我用于实例化和使用这些不同组件的代码如下所示:
using (var context = m_kernel.Get<IPortalContext>())
{
var accountRepository = m_kernel.Get<IAccountRepository>(new ConstructorArgument("context", context));
var eventRepository = m_kernel.Get<IEventRepository>(new ConstructorArgument("context", context));
var accounts = m_kernel.Get<IAccountService>(new ConstructorArgument("repository", accountRepository));
var events = m_kernel.Get<IEventService>(new ConstructorArgument("repository", eventRepository));
var account = accounts.GetByUsername("test@test.com");
}
您可以看到我创建了一个上下文,然后我创建了我的存储库并为其提供了现有上下文,最后我创建了我的服务并为他们提供存储库。然后,我可以免费使用这些服务。
不过,该代码非常冗长。我可以通过在服务内部而不是外部创建存储库实例来使其更干净。
不过,在尝试这样做时,我的困惑来了。我将 Ninject 用于我的 DI,并且我想创建绑定到IAccountService
构造函数内部IAccountRepository
接口的类的实例。最重要的是,它还需要知道使用提供的IPortalContext
。
我是否必须将 Ninject 作为依赖项添加到我的服务层项目中,并在其中创建一个新的内核,并在里面使用 Kernel.Get() 作为 IAccountService
构造函数?或者有没有办法告诉 Ninject 从我的单元测试中完成这一切?
我想在
IAccountService
构造函数中创建绑定到IAccountRepository
接口的类的实例
那你为什么要用NInject? 该依赖项应注入(因此得名),而不是在服务中创建。
在服务中执行此操作可能看起来很"干净",但您将失去松散耦合图层的所有好处。
如果你发现你正在重复这 6 行代码(恕我直言,这不是"冗长"),那么你可以将其重构为一个单独的函数(在你的单元测试和应用层中),并在需要时调用它。