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;
    }
}

在进行单元测试时,您可以手动将虚假或模拟电子邮件服务注入用户服务.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....