我有一个 ASP.NET MVC 3 应用程序,它使用 Ninject.MVC3 扩展在我的 MVC 应用程序中设置 DI。也就是说,有NinjectMVC3.cs
文件在App_Start
定义我的绑定的文件夹。这对于 DI 到我的应用程序的控制器来说效果很好。
除了 ASP.NET MVC Web 应用程序之外,我的解决方案还包含一个类库项目,我们称之为MyProject.Core
,其中有我的域模型、服务等。在那里我有一堂课叫UserServices
使用名为的服务EmailServices
,像这样:
public class UserServices : IUserServices
{
private readonly IEmailServices _emailServices = new EmailServices();
public void CreateUser(...)
{
// Create user...
_emailServices.SendWelcomeEmail(newUser);
}
}
如您所见,UserServices
类有硬编码依赖EmailServices
,但我也希望将其配置为使用 DI。也就是说,在我的 ASP.NET MVC 应用程序(或单元测试项目或任何地方)中,我希望能够说,“BindIEmailServices
to use TestEmailServices
“并且有UserServices
课堂使用TestEmailServices
代替EmailServices
.
我该怎么做呢?我希望能够做类似的事情:
public class UserServices : IUserServices
{
private readonly IEmailServices _emailServices = kernel.Get<EmailServices>();
...
}
但我不确定在哪里kernel
在这种情况下,将来自。我问的有道理吗,还是我在这里吠错了树?
Thanks
您应该能够通过构造函数注入来做到这一点,如下所示:
private readonly IEmailServices _emailServices;
public UserServices(IEmailServices emailServices)
{
_emailServices = emailServices;
}
控制器中的服务注入应该由 Ninject 自定义控制器工厂自动处理,它将使用配置的 IoC 容器来解析IUserServices
创建控制器时的对象,该控制器将依次被赋予一个IEmailServices
容器中的对象:
public class MyController : Controller
{
private readonly IUserServices _userServices;
public MyController(IUserServices userServices)
{
_userServices = userServices;
}
}
当您进行单元测试时,您可以手动将虚假或模拟电子邮件服务注入到用户服务中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)