【发布时间】:2019-01-28 13:48:07
【问题描述】:
我有一个存储库类,它有一个带有字符串参数参数的构造函数。它是一个连接字符串。我为它创建了一个界面,并在我的 UI 项目中使用 Unity。
我的问题是,如何以“正确”的方式进行设置,以便 Unity 知道如何正确构造我的类,以便在实例化我的控制器时注入它?
我目前通过为我的存储库使用无参数构造函数来“解决”这个问题,但感觉这是一种逃避。
这是我要使用的存储库构造函数...
public CobraLettersRepository(string dbConnectionString)
{
_connString = dbConnectionString ?? throw new ArgumentNullException(dbConnectionString);
dbConnection = new SqlConnection(_connString);
dbConnection.Open();
}
我创建了 ICobraLettersRepository 并希望将其注入到我的控制器构造函数中。
public CobraLetterController(ICobraLetterRepository cobraLetterRepository)
{
if (cobraLetterRepository == null)
throw new ArgumentNullException(cobraLetterRepository);
_cobraLetterRepo = cobraLetterRepository;
}
当我尝试此操作时,代码会编译,但每当我尝试导航到调用这些控制器方法的应用程序部分时都会出现运行时错误。
【问题讨论】:
-
“我得到运行时错误” 哪些?请更具体地说明您的问题。从我的角度来看,假设
CobraLettersRepository实现了ICobraLetterRepository,您的代码还可以。除此之外:你肯定想要ArgumentNullException(nameof(dbConnectionString))。 -
您可以提供一个
func,它将一个对象的实例返回给服务,例如services.AddScoped((IServiceProvider) => new SQLLogger(connectionString)); -
在构造函数中打开连接是一个主要错误。连接应该只在它们被使用之前被创建和打开,然后在之后被释放。长连接唯一能做的就是积累锁并导致阻塞。反复打开/关闭连接并没有没有的惩罚,实际上它通过连接池提高了性能。
标签: c# model-view-controller dependency-injection unity-container