Dependency injection 从依赖程序集访问NInject内核

Dependency injection 从依赖程序集访问NInject内核,dependency-injection,asp.net-mvc-5,ninject,ninject.web.mvc,Dependency Injection,Asp.net Mvc 5,Ninject,Ninject.web.mvc,我有一个ASP.NETMVC5项目,在这个项目中,我需要使用一个自定义的基于web服务的电子邮件服务(说来话长!但不能更改它) 我将电子邮件web服务包装到一个单独的程序集中,并将所有依赖项打包在其中 在我的ASP.NET MVC 5应用程序中,我使用Ninject进行依赖项注入,它在MVC项目中运行得非常好-控制器“神奇地”注入了它们的依赖项,使用它是一种乐趣 但是现在:对于我的电子邮件发送组件,我想编写一个“模拟”或模拟器,以便在进行开发时在本地使用。因此,基本上,我需要能够将IMailSe

我有一个ASP.NETMVC5项目,在这个项目中,我需要使用一个自定义的基于web服务的电子邮件服务(说来话长!但不能更改它)

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

在我的ASP.NET MVC 5应用程序中,我使用Ninject进行依赖项注入,它在MVC项目中运行得非常好-控制器“神奇地”注入了它们的依赖项,使用它是一种乐趣

但是现在:对于我的电子邮件发送组件,我想编写一个“模拟”或模拟器,以便在进行开发时在本地使用。因此,基本上,我需要能够将
IMailService
绑定到
MailService
(真实实现)以及
MailServiceSimulator
(我的虚拟实现)。Ninject支持这一点,没有问题:

Bind<IMailService>().To<MailService>().Named("Production");
Bind<IMailService>().To<MailServiceSimulator>().Named("Simulator");
如果需要实际实施,或

return kernel.Get<IMailService>("Simulator");
返回kernel.Get(“模拟器”);
如果应使用
IMailService
的开发时间模拟器

由于我的MVC应用程序已经使用“MailService”程序集作为参考,我无法真正让“MailService”使用“MVC”项目作为参考。。。。那么,如何从引用的“MailService”程序集中访问Ninject内核(在启动时在“MVC”程序集中创建)??似乎我在兜圈子,一个程序集需要另一个,然后另一个程序集又需要第一个程序集作为依赖项


有什么想法吗?

在您的邮件服务项目中访问内核或做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");
Bind().To())
.When(r=>ConfigurationManager.AppSettings.Get(“MailSwitch”)==“Production”);
将()绑定到()上
.When(r=>ConfigurationManager.AppSettings.Get(“MailSwitch”)==“Simulator”);

我一直在使用本地安装来完成这类工作。还有其他一些工具可以做类似的事情。我发现它真的很有用,因为我还能够“验证”我的电子邮件和内容是否有效、拼写是否正确等等。。。。我可能不会费心去尝试moq/stub这个…@DaiBok:正如我所说的-我必须使用客户提供的邮件服务接口,我不能使用常规的SMTP:…@DaiBok:但我完全同意你的看法-如果你使用的是“常规”SMTP,那么类似smtp4dev的东西是帮助开发的一个很好的工具!
Bind<IMailService>().To<MailService>()
    .When(r => ConfigurationManager.AppSettings.Get("MailSwitch")=="Production");
Bind<IMailService>().To<MailServiceSimulator>()
    .When(r => ConfigurationManager.AppSettings.Get("MailSwitch")=="Simulator");