2017-01-16 129 views
7

在.net核心,如果我使用依賴注入是真的,所有的構造參數必須由DI提供?.net核心依賴注入與構造函數參數

比方說:

public Person CreateClient() 
{ 
    string phone = "12345678"; 
    return new Person(phoneNumber: phone);   
} 

public class Person 
{ 
    private readonly ISomeService _service; 
    private readonly string _phoneNumber; 
    public Person (ISomeService service, string phoneNumber) 
    { 
     _service = service; 
     _phoneNumber = phoneNumber; 
    } 

    public string PhoneNumber {get { return _phoneNumber; } } 
    public string Gender {get { return _service.GetGenderFromDb(); } } 
} 

public interface ISomeService 
{ 
    String GetGenderFromDb(); 
} 

public class FooService : ISomeService 
{ 
    public String GetGenderFromDb() { return "Male"; } 
} 

這是可能的DI,並通過客戶端提供的價值留在同一個構造函數?

+0

如何在啓動時註冊這些服務? – Ahmar

+0

@Ahmar只是正常註冊 services.AddTransient (); –

+0

好的DI只解決依賴註冊的問題。其他參數未解決。 – Ahmar

回答

7

任何你調用「new」創建對象的地方都不適合從上到下做構造函數DI。當您想要將參數傳入構造函數時,DI不適用。

正如其他人所指,最好的辦法是建立一個工廠。它可能看起來像這樣。

public class Person 
{ 
    private readonly ISomeService _service; 
    private readonly string _phoneNumber; 
    public Person (ISomeService service, string phoneNumber) 
    { 
     _service = service; 
     _phoneNumber = phoneNumber; 
    } 

    public string PhoneNumber {get { return _phoneNumber; } } 
    public string Gender {get { return _service.GetGenderFromDb(); } } 
} 

public class PersonFactory : IPersonFactory 
{ 
    private readonly ISomeService _someService; 

    public PersonFactory(ISomeService someService) 
    { 
     _someService = someService; 
    } 

    public GetPerson(string phoneNumber) 
    { 
     return new Person(_someService, phoneNumber); 
    } 
} 

現在,當你想創建一個人,而不是你會注入在IPersonFactory一個實例,並調用它GetPerson。此外,您可能會發現,您希望自己的模型更加簡單,而且工廠可以完成大部分繁重的工作。我看到性別是從數據庫的時刻即將到來,所以你可以改變它看起來更像如下:

public class Person 
{ 
    public Person (string gender, string phoneNumber) 
    { 
     Gender = gender; 
     PhoneNumber = phoneNumber; 
    } 

    public string PhoneNumber {get; private set; } 
    public string Gender {get; private set;} 
} 

public class PersonFactory : IPersonFactory 
{ 
    private readonly ISomeService _someService; 

    public PersonFactory(ISomeService someService) 
    { 
     _someService = someService; 
    } 

    public GetPerson(string phoneNumber) 
    { 
     var gender = _someService.GetGenderFromDb(); 
     return new Person(gender, phoneNumber); 
    } 
} 

現在你的Person類沒有關於它得到了一個性別的任何細節,並且工廠每次都制定瞭如何創建Person模型。

+0

這個答案原來是一樣的,我的實現後,我從@Tseng建議的想法。感謝張貼這個答案 –

相關問題