我有一个ASP.NET MVC 3应用程序,它使用Ninject.MVC3扩展来在我的MVC应用程序中设置DI.也就是说,App_Start文件夹中有NinjectMVC3.cs文件,其中定义了我的绑定.这适用于我的应用程序控制器中的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应用程序(或单元测试项目或任何地方),我希望能够说,“绑定IEmailServices以使用TestemailServices”并让UserServices类使用TestemailServices而不是EmailServices.
我该怎么做呢?我希望能够做到这样的事情:
public class UserServices : IUserServices { private readonly IEmailServices _emailServices = kernel.Get<EmailServices>(); ... }
但在这种情况下,我不确定内核将来自哪里.我在问什么是有道理的,还是我在这里咆哮错了?
谢谢
解决方法
您应该能够使用构造函数注入执行此操作,如下所示:
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; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。