具有接口的依赖项注入,但构造函数需要字符串参数

时间:2019-01-28 13:48:07

标签: c# model-view-controller dependency-injection unity-container

我有一个存储库类,该类具有带字符串参数参数的构造函数。它是一个连接字符串。我为此创建了一个界面,并在我的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;
    }

尝试这种方法时,代码会编译,但是每当尝试导航到应用程序中调用这些控制器方法的部分时,都会遇到运行时错误。

2 个答案:

答案 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 InterfaceResolve named registration dependency in Unity with runtime parameter)。