【问题标题】:Manually inject service in asp.net core mvc6?在asp.net core mvc6中手动注入服务?
【发布时间】:2016-03-17 04:25:47
【问题描述】:

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

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 不需要吗?仅创建实例基本上没有开销,因此某些操作是否需要与不同数据库的多个连接无关紧要?

【问题讨论】:

    标签: dependency-injection asp.net-core-mvc


    【解决方案1】:

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

    public class ProductServices(){
       public ProductServices(IDbConnection conn){
         ...
      }
    
      public List<Product> GetProducts(){
        ...
      }
    }
    

    using 不是必需的。根据经验,如果实例是通过 IoC 容器创建的(例如 Unity、Autofac、Ninject 等),它也应该被 IoC 容器销毁。

    【讨论】:

      猜你喜欢
      • 2016-11-05
      • 2020-09-15
      • 2021-09-05
      • 2018-07-22
      • 2017-01-03
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多