Dependency injection 在asp.net核心mvc6中手动注入服务?

Dependency injection 在asp.net核心mvc6中手动注入服务?,dependency-injection,asp.net-core-mvc,Dependency Injection,Asp.net Core Mvc,我想使用DI在api控制器中手动注入IDBConnection。我知道我可以把它放在构造器中: public MyController(IDBConnection cnn) { this._Connection = cnn; } 或者我可以使用[FromServices]属性: [FromServices] public IDbConnection _Connection { get; set; } 我可以在这样的视图中使用它: @inject IDbConnection cnn usin

我想使用DI在api控制器中手动注入
IDBConnection
。我知道我可以把它放在构造器中:

public MyController(IDBConnection cnn) { this._Connection = cnn; }
或者我可以使用
[FromServices]
属性:

[FromServices]
public IDbConnection _Connection { get; set; }
我可以在这样的视图中使用它:

@inject IDbConnection cnn
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);
});
我真正想做的是使用将其放入一个
中,并让DI打开连接,这样我就可以执行以下操作:

@inject IDbConnection cnn
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);
});
使用(var cnn=Services.Inject()){
//做点什么,不要担心打开或关闭
}
我是这样宣布的:

@inject IDbConnection cnn
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);
});
services.AddTransient(x=>
{
string connectionString=Configuration.Get(
“数据:默认连接:连接字符串”);
返回新的SqlConnection(connectionString);
});

我是否应该创建一个继承自
SqlConnection
的类,该类在其构造函数中调用
Open()
?如何从那里访问
配置
?我可以这样创建它来注入配置或连接字符串。。。
是否不需要使用
?仅仅创建实例基本上没有开销吗?这样一些操作是否需要多个到不同数据库的连接就无关紧要了?

我建议您创建一个控制器将依赖的服务层,而不是直接访问数据库连接(您不必在视图中声明此项
@inject IDbConnection cnn
)。您的视图只应声明控制器方法返回的模型,并且您将在视图页面中获得良好的intellisense支持

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

  public List<Product> GetProducts(){
    ...
  }
}
public类产品服务(){
公共产品服务(IDB连接连接){
...
}
公共列表产品(){
...
}
}
不需要使用
。根据经验,如果实例是通过IoC容器(如Unity、Autofac、Ninject等)创建的,那么它也应该被IoC容器销毁