如何在依赖项目中使用 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 从我的单元测试中完成这一切?

如何在依赖项目中使用 Ninject 创建类的新实例?(不在引导项目中)

我想在 IAccountService 构造函数中创建绑定到IAccountRepository接口的类的实例

那你为什么要用NInject? 该依赖项应注入(因此得名),而不是在服务中创建。

服务中执行此操作可能看起来很"干净",但您将失去松散耦合图层的所有好处。

如果你发现你正在重复这 6 行代码(恕我直言,这不是"冗长"),那么你可以将其重构为一个单独的函数(在你的单元测试和应用层中),并在需要时调用它。