从依赖程序集访问 NInject 内核

Accessing NInject kernel from a dependent assembly

我有一个 ASP.NET MVC 5 项目,我需要在其中使用基于自定义 Web 服务的电子邮件服务(长话短说!不过无法更改)。

我将电子邮件 Web 服务打包到一个单独的程序集中,并将所有依赖项打包到其中。

在我的 ASP.NET MVC 5 应用程序中,我使用 Ninject 进行依赖注入,它在 MVC 项目中运行得非常好 - 控制器注入了它们的依赖关系 "magically" ,用起来很开心。

但是现在:对于我的电子邮件发送组件,我想写一个"mock"或者模拟器,以便在开发时在本地使用。所以基本上,我需要能够将 IMailService 绑定到 MailService(实际实现)以及 MailServiceSimulator(我的虚拟实现)。 Ninject 支持,没问题:

Bind<IMailService>().To<MailService>().Named("Production");
Bind<IMailService>().To<MailServiceSimulator>().Named("Simulator");

BUT:问题是这样的:我在 MVC 应用程序中用 Ninject 注册了所有依赖项(在 NinjectWebCommon class在 App_Startup) - 但我希望能够在我的 "mail service" 项目中有一个工厂 class 可以告诉 return 一个真正的实现 - 或者模拟器- 用于邮件发送组件。但是我怎样才能访问 Ninject 内核以获得所需的服务呢?

不知何故,我需要能够做到其中之一

return kernel.Get<IMailService>("Production");

如果需要真正的实现,或者

return kernel.Get<IMailService>("Simulator");

如果应该使用 IMailService 的开发时模拟器。

因为我的 MVC 应用程序已经使用 "MailService" 程序集作为参考,所以我不能真正让 "MailService" 使用 "MVC" 项目作为参考....所以怎么能我从引用的 "MailService" 程序集中访问 Ninject 内核(在启动时在 "MVC" 程序集中创建)?似乎我在兜圈子,一个程序集需要另一个程序集,然后另一个程序集又需要第一个程序集作为依赖项.....

有什么想法吗?

在您的 MailService 项目中访问内核或进行 DI 业务似乎是一个有漏洞的抽象。

假设 "Production/Simulator" 开关作为 "MailSwitch" 设置位于 appSettings 中,您可以省略命名绑定并转到:

Bind<IMailService>().To<MailService>()
    .When(r => ConfigurationManager.AppSettings.Get("MailSwitch")=="Production");
Bind<IMailService>().To<MailServiceSimulator>()
    .When(r => ConfigurationManager.AppSettings.Get("MailSwitch")=="Simulator");