2017-07-29 157 views
0

ASP.NET核心接入等服务这是一个ASP.NET默认核心项目ConfigureServices方法:使用依赖注入

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddIdentity<ApplicationUser, IdentityRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

    services.AddMvc(); 

    // Add application services. 
    services.AddTransient<IEmailSender, AuthMessageSender>(); 
    services.AddTransient<ISmsSender, AuthMessageSender>(); 
} 

我的问题是我怎么能访问内部ApplicationDbContext电子邮件服务或短信服务?

还是让我们说我将有一个自定义的服务构建和我注册它在DI这样的:

services.AddTransient<ICustomService, CustomService>(); 

我怎么能访问这里面的电子邮件服务或短信服务?

我认为电子邮件和短信服务必须添加到DI之前,其他服务将使用它们的权利?

回答

2

ASP.NET Core提供的默认DI实现仅支持构造函数注入。你CustomService类应该有ctor一个期望的依赖关系(短信/邮件发送)作为参数:

public class CustomService : ICustomService 
{ 
    public ClassName(IEmailSender emailSender, ISmsSender smsSender) 
    { 
     // use senders here or store in private variables 
    } 
} 

当你定义构造函数,注意(从Constructor Injection Behavior部分)

  • 构造方法注入要求有问题的建设者应该公开。
  • 构造函数注入要求只存在一个适用的构造函数。支持构造器重载,但只有一个重载可以存在,其参数可以全部通过依赖注入来实现。
  • 构造函数可以接受非依赖注入提供的参数,但这些参数必须支持默认值。

我假设电子邮件和短信服务,必须在此之前将使用他们的权利,其他服务被添加到DI?

它们应该在DI容器中注册,然后才会尝试构造期望它作为构造函数参数的类的第一个实例。 同方法services.AddTransient<ICustomService, CustomService>();不会实例CustomService类中,仍然跟随它的有效代码:

services.AddTransient<ICustomService, CustomService>(); 
services.AddTransient<IEmailSender, AuthMessageSender>(); 
services.AddTransient<ISmsSender, AuthMessageSender>(); 

但它从简单的以注册到复杂类型一个很好的做法。