我想使用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
吗?只是创建实例基本上没有开销,所以如果某些操作需要多个连接到不同的数据库就不重要了吗?
答案 0 :(得分:0)
我建议您创建一个控制器将依赖的服务层,而不是直接访问数据库连接(在视图中@inject IDbConnection cnn
不需要这样做)。您的视图应该只声明控制器方法返回的模型,并且您将在视图页面中获得良好的智能感知支持。
public class ProductServices(){
public ProductServices(IDbConnection conn){
...
}
public List<Product> GetProducts(){
...
}
}
using
不是必需的。根据经验,如果实例是通过IoC容器创建的(例如Unity,Autofac,Ninject等),它也应该被IoC容器销毁。