2016-02-10 73 views
2

這裏是我的應用程序如何使對數據庫的調用: Web應用程序 - >業務層 - >數據層使用繼承和依賴注入的同時

一切都在使用依賴注入。

例如:

在我的Web應用程序控制器我作出這樣一個電話:

await _manager.GetCustomers(); 

其中進入我的業務層:

public class CustomerManager : ICustomerManager 
{ 
    private ICustomerRepo _repository; 
    public CustomerManager(ICustomerRepo repository) 
    { 
     _repository = repository; 
    } 

    public Task<IList<Customer>> GetCustomers(string name = null) 
    { 
     return _repository.GetCustomers(name); 
    } 
} 

進入我的數據層:

public class CustomerRepo : BaseRepo, ICustomerRepo 
{ 
    public CustomerRepo(IConfigurationRoot configRoot) 
    : base(configRoot) 
    { 
    } 

    public Customer Find(int id) 
    { 
     using (var connection = GetOpenConnection()) 
     { 
      ... 
     } 
    } 
} 

這裏的技巧是CustomerRepo繼承自BaseRepo以便能夠使用GetOpenConnection()函數。但同時BaseRepo需要從Web應用程序注入IConfigurationRoot。我怎樣才能做到這一點?

public class BaseRepo 
{ 
    private readonly IConfigurationRoot config; 

    public BaseRepo(IConfigurationRoot config) 
    { 
     this.config = config; 
    } 

    public SqlConnection GetOpenConnection(bool mars = false) 
    { 
     string cs = config.GetSection("Data:DefaultConnection:ConnectionString").ToString(); 
     ... 
    } 
} 
+0

'CustomerRepo'的構造函數是怎樣的?它是否需要一個'IConfigurationRoot'並將其提供給基礎構造函數? –

+0

我目前在我的CustomerRepo中沒有構造函數,我認爲這可能是我錯過的!我不明白我如何做到這一點的語法。如果BaseRepo在類聲明中,並且在此之後聲明構造函數。我怎樣才能將它作爲參數發送給BaseRepo?你能告訴我一個例子嗎? –

+0

'BaseRepo'是否有無參數的構造函數? 'CustomerRepo'是否被編譯? –

回答

4

不管依賴注入如何實例化(甚至編譯)CustomerRepo?您需要使用參數IConfigurationRoot傳遞給基礎構造函數。如:

public CustomerRepo(IConfigurationRoot configRoot) 
    : base(configRoot) 
{ 
} 

有關基本關鍵字的信息,請參閱https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx

+0

我很確定這是我正在尋找的確切語法。我想知道如何在繼承的同時傳遞一個參數。那麼我將不得不更新我的業務層? –

+0

@BlakeRivell你是通過傳遞一個'CustomerRepo'來手動構建一個CustomerManager嗎?如果是這樣,當你構造它時,你需要給'CustomerRepo'一個'IConfigurationRoot'。如果您使用的是可以註冊類型的IOC容器,那麼註冊ICustomerRepo和IConfigurationRoot就足夠了,容器將能夠爲您解決依賴關係。 –

+0

我正在使用ASP.NET 5和內置的依賴注入。我不是手動傳遞任何東西。我在我的Web應用程序的Startup.cs中的Register服務中指定了所有內容,就像配置任何其他IoC容器一樣。所以我試圖遵循這種模式,希望能夠將我的應用程序設置下載到我的BaseRepo,同時仍然使用依賴注入。這會改變什麼嗎?我將我的帖子更新爲我的資源庫類現在的樣子。我被告知在ConfigureServices方法中這樣做會奇蹟般地工作:服務。AddSingleton(_ => Configuration); –