我正在从事一个具有多层架构的项目。这些层在它们自己的类库项目中,但都在同一个解决方案中。在较低的层,我已经有了存储库模式,包括我的模型、存储库和 dbcontext。在我的存储库之上是一个服务层,它包含了我所有的业务逻辑。现在,在我的单元测试中,我用于实例化和使用这些不同组件的代码如下所示:
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,并且我想创建一个绑定到构造函数IAccountRepository
内部接口的类的实例。IAccountService
最重要的是,它还需要知道如何使用提供IPortalContext
的。
我是否必须将 Ninject 作为依赖项添加到我的服务层项目并在其中创建一个新内核并在内部使用 Kernel.Get() 作为IAccountService
构造函数?或者有没有办法告诉 Ninject 从我的单元测试中完成这一切,例如?