【问题标题】:How to improve dependency injection?如何改进依赖注入?
【发布时间】:2016-09-06 18:17:45
【问题描述】:

我已经创建了 IDataProvider 接口并像这样实现它:

public class DatabaseDataProviderBase : IDataProvider
{
    private readonly IDatabaseConnectionStringProvider _databaseConnectionStringProvider;
    private readonly IParameterApplicator<string> _sqlParameterApplicator;
    private readonly IDatabaseDataProvider _databaseDataProvider;

    public DatabaseDataProviderBase(IDatabaseConnectionStringProvider databaseConnectionStringProvider, IParameterApplicator<string> sqlParameterApplicator, IDatabaseDataProvider databaseDataProvider)
    {
        _databaseConnectionStringProvider = databaseConnectionStringProvider;
        _sqlParameterApplicator = sqlParameterApplicator;
        _databaseDataProvider = databaseDataProvider;
    }

    public DataSet GetData(SqlResource sqlResource, List<Parameter> parameters)
    {
        var connectionString = _databaseConnectionStringProvider.Get(sqlResource.SqlConnection);
        var selectQuery = _sqlParameterApplicator.Apply(parameters, sqlResource.SelectQuery);
        var dataSet = _databaseDataProvider.Get(connectionString, selectQuery);

        return dataSet;
    }
}

现在我需要很多从这个类继承的类。即NpgsqlDataProviderMsSqlDataProviderOdbcDataprovider 等等。这些类中的每一个都有自己的IDatabaseConnectionStringProviderIDatabaseDataProvider 实现。我将通过在 Ninject 模块中绑定它们来告诉使用哪个实现。

这是正确的方法还是有更好的解决方案?因为在此之前我已经使用了很多工厂,这些工厂创建了前面提到的接口的必要实现,很快就变成了维护它的噩梦。但是现在,这似乎是更好的方法——我有一个基类,我将从中继承和绑定继承类的必要依赖项。

然而,继承的类只是空的——它们正在使用这个基类DatabaseDataProviderBase 实现,因此,我觉得我做错了什么。建议表示赞赏。

【问题讨论】:

    标签: c# asp.net inheritance dependency-injection ninject


    【解决方案1】:

    为了完整性,您不需要派生类。您的基类看起来已经完成了。

    关键在于您将使用课程的方式。你只是要使用IDataProvider吗?

    IDataProvider consumer = new ...
    

    如果是这样,那么问题可能在于更新数据提供者。您可以为此目的使用工厂并完成它:

    void Consumer(Func<IDataProvider> providerFactory)
    {
        IDataProvider provider = providerFactory();
        ...
    }
    

    这样,您只需将提供者工厂填充到所有消费类,并让它们使用抽象数据提供者。只要您能够提供一个 Func&lt;IDataProvider&gt; 委托或另一个,您就不需要任何派生类。

    【讨论】:

    • 我想通过构造函数注入将IDataProvider注入消费者。但是,如果我没有派生类并且不会在 ninject 模块中指定具体绑定,那么基类如何知道要使用 IDatabaseConnectionStringProvider 的哪个实现?
    • 但是连接字符串提供者是数据提供者的构造函数参数。消费者不必知道。 Ninject 支持更细粒度的设置。详情可以参考他们的文档:github.com/ninject/Ninject/wiki/Contextual-Binding
    猜你喜欢
    • 2011-08-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多