2017-04-19 68 views
3

最近,我一直在嘗試新的asp.net功能並遇到此問題。 我知道我們可以將配置讀爲強類型實例。但我不知道如何將配置注入到我的課程在Microsoft依賴注入。如何從AppSettings讀取配置值並將配置注入接口實例

public interface IProvider 
{ 
    IMyConfiguration Configuration {get;} 
    Task Connect(); 
} 

public abstract class Provider: IProvider 
{ 
    private IMyConfiguration _myConfig; 

    public Provider(IMyConfiguration config) 
    { 
     this._myConfig= config; 
    } 

    public IMyConfiguration Configuration => _myConfig; 
    public abstract Task Connect(); 
} 

public class ProviderOne:Provider 
{ 
    public ProviderOne(IMyConfiguration config) : base(config) 
    { 
    } 

    public Task Connect() 
    { 
     //implementation 
    } 
} 

配置類:

public interface IMyConfiguration 
{ 
    string TerminalId { get;set; } 
    bool IsDefault {get;set;} 
} 
public class MyConfiguration : IMyConfiguration 
{ 
    string TerminalId { get;set; } 
    bool IsDefault {get;set;} 
} 

,然後在startup.cs如我聲明,則需要通過MyConfiguration。但我找不到這樣做的方法。請指教!

public void ConfigureServices(IServiceCollection services) 
{ 
    services.Configure<MyConfiguration>(Configuration.GetSection("MyConfiguration")); 
    services.AddSingleton<IProvider>(new ProviderOne(//configuration)); //here is the problem 
} 

回答

4

選項1

首先,你不需要IMyConfiguration接口。 .NET Core已經使用自己的IOptions接口進行抽象。當您使用

services.Configure<MyConfiguration>(Configuration.GetSection("MyConfiguration")); 

你告訴DI如何解決下一依賴性:IOptions<MyConfiguration>

所以,與其

public Provider(IMyConfiguration config) 

使用

private MyConfiguration _myConfig; 

public Provider(IOptions<MyConfiguration> options) 
{ 
    this._myConfig = options.Value; 
} 

同爲ProviderOne

public ProviderOne(IOptions<MyConfiguration> options) : base(options) 

由於.NET核心DI知道如何解決已註冊的依賴,現在你可以簡單地使用該方法的下一個版本:

services.AddSingleton<IProvider, ProviderOne>(); 

選項2

你可以保留你的代碼;在ConfigureServices方法直接實例的實例MyConfiguration和使用ypur提供商創建實例:

var myConfiguration = new MyConfiguration(); 
Configuration.GetSection("MyConfiguration").Bind(myConfiguration); 

services.AddSingleton<IProvider>(new ProviderOne(myConfiguration)); 

的主要區別是,在這種情況下,您不使用DI容器ProviderOne實例。所以主要的缺點是,如果你需要爲你的提供者添加更多的依賴關係(並且擴展構造器參數的數量),你也應該在ConfigureServices方法中解決這些依賴關係。有關更多詳細信息,您可能會發現下一個有用的討論:Best way to resolve during ConfigureServices

在一般情況下,當情況你只有一個執行IMyConfiguration,這是可以做到即便如此:

services.AddSingleton<IMyConfiguration>(myConfiguration); 
services.AddSingleton<IProvider, ProviderOne>(); 

和DI容器將瞭解如何處理。但是由於內置的​​DI容器不允許註冊多個服務,然後檢索特定的服務,所以這不適用於您。有些人通過使用工廠模式解決了這個問題。您將在下面的SO問題中找到更多內容:How to register multiple implementations of the same interface in Asp.Net Core?

+0

好,但有一個問題,可以說我們有不同的MyConfiguration和Provider實例,每個提供程序應該如何連接到它的配置。 – Behzad

+0

@Behzad好的,我已經添加了選項2 – Set

+0

這樣做很好嗎?我的意思是,如果簡單地使用DI,我真的很想在我的應用 – Behzad