2017-07-29 155 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>(); 

但它從簡單的以註冊到複雜類型一個很好的做法。