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

时间:2016-03-17 04:25:47

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

我想使用DI在我的api控制器中手动注入#include <iostream> using namespace std; int main() { int N; int count = 0; cin >> N; for (int i = 2; N > 0; ++i) { bool isPrime = true; for (int j = 2; j < i; ++j) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) { if (i > N) break; count++; cout << i << "\n"; } } cout << "The number of primes from 0 to " << N << " is " << count << endl; char stop; cin >> stop; return 0; } 。我知道我可以把它放在构造函数中:

IDBConnection

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

[FromServices]

我可以在这样的观点中使用它:

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

我真正想做的是将它放在@inject IDbConnection cnn 中,并让DI打开连接,这样我就能做到这样的事情:

using

我宣布这样:

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吗?只是创建实例基本上没有开销,所以如果某些操作需要多个连接到不同的数据库就不重要了吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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