在 ASP.NET MVC 3 应用程序的类库中引用 Ninject

2023-12-07

我有一个 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(使用前将#替换为@)

在 ASP.NET MVC 3 应用程序的类库中引用 Ninject 的相关文章

随机推荐