微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – 在ASP.NET MVC 3应用程序中引用类库中的Ninject

我有一个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 举报,一经查实,本站将立刻删除。

相关推荐