我有一个存储库类,该类具有带字符串参数参数的构造函数。它是一个连接字符串。我为此创建了一个界面,并在我的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;
}
尝试这种方法时,代码会编译,但是每当尝试导航到应用程序中调用这些控制器方法的部分时,都会遇到运行时错误。
答案 0 :(得分:1)
我会说将连接字符串封装在配置对象中,并将获取的连接字符串放入该配置对象的构造函数中。 然后只需将配置对象注册为其他类即可。
public class ProjectConfiguration
{
public string ConnectionString { get; set; }
public ProjectConfiguration()
{
ConnectionString = //Get the configuration from , i.e: ConfigurationManager
}
}
然后注入它:
public CobraLettersRepository(ProjectConfiguration configuration)
{
if(configuration == null){
throw new ArgumentNullException(configuration);
}
_connString = configuration.ConnectionString;
dbConnection = new SqlConnection(_connString);
dbConnection.Open();
}
因此,您始终可以将配置与DI容器隔离开,并使注入尽可能简单。另外,您可以从配置文件中获取配置(每个环境一个)。
编辑:还检查您的存储库构造函数逻辑,也许您不想在构造函数上打开连接。最好在您的类方法上使用using语句:
using(SqlConnection connection = new SqlConnection(_injectedConfiguration.ConnectionString)){
connection.Open();
//Make your stuff here
}
使用时,请确保正确处置连接。
请注意,使用配置对象方法,您可以将配置对象存储在私有只读变量中,并在需要时使用它。
答案 1 :(得分:0)
注册期间,使用InjectionConstructor
传递连接字符串名称。您需要删除所有需要string
参数的构造函数。
container.RegisterType<ICobraLetterRepository,CobraLettersRepository>(new InjectionConstructor("connectionstringname"));
请注意,这将导致在某些地方/某些时间出现问题。您需要更改逻辑以创建数据库连接(您可以参考Breaking SOLID Principles in multiple implementation of an Interface或Resolve named registration dependency in Unity with runtime parameter)。