2016-03-17 35 views
2

我想用DI在我的api控制器中手動注入IDBConnection。我知道我可以把它在構造函數中:在asp.net核心mvc6中手動注入服務?

public MyController(IDBConnection cnn) { this._Connection = cnn; } 

或者我可以使用[FromServices]屬性:

[FromServices] 
public IDbConnection _Connection { get; set; } 

而且我可以這樣使用它訪問量:

@inject IDbConnection cnn 

什麼我真的想做的將是在using,並讓DI打開連接,所以我可以做這樣的事情:

using (var cnn = Services.Inject<IDbConnection>()) { 
    // do something, don't worry about opening or closing 
} 

我聲明瞭它這樣的:

services.AddTransient<IDbConnection>(x => 
{ 
    string connectionString = Configuration.Get<string>(
      "Data:DefaultConnection:ConnectionString"); 
    return new SqlConnection(connectionString); 
}); 

我應該創建一個類從SqlConnection調用它的構造Open()繼承?我如何從那裏訪問Configuration?我可以創建它,就像注入配置或連接字符串...是不是需要using?基本上沒有創建實例的開銷,所以如果某些操作需要多個連接到不同的數據庫,這並不重要。

回答

0

我建議您創建一個服務層,您的控制器將依賴於而不是直接訪問數據庫連接(並且您不需要在您的視圖@inject IDbConnection cnn中查看)。您的視圖應該只聲明您的控制器方法返回的Model,並且您將在視圖頁面中擁有良好的智能感知支持。

public class ProductServices(){ 
    public ProductServices(IDbConnection conn){ 
    ... 
    } 

    public List<Product> GetProducts(){ 
    ... 
    } 
} 

using不是必需的。作爲一個經驗法則,如果實例是通過IoC容器創建的(例如Unity,Autofac,Ninject等),它也應該被IoC容器銷燬。