2016-09-06 66 views
0

我已经创建并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; 
    } 
} 

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

这是一个正确的方式去或者有更好的解决方案吗?因为在那之前我曾经使用过很多工厂,这些工厂创建了前面提到的接口的必要实现,并且很快成为维护它的噩梦。但现在,这似乎是更好的方法 - 我有一个基类,从中我将继承和绑定继承类的必要依赖关系。

但是,继承类只是空的 - 他们正在使用这个基类的实现,因此,我觉得我做错了什么。建议感激。

回答

0

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

重点在于你将如何消耗课程。你只是要使用IDataProvider

IDataProvider consumer = new ... 

如果是这样,那么问题可能在于新的数据提供者。您可以使用一个工厂用于该目的,用它做:

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

这样,你只需要填写供应商工厂,所有的消费类和让他们用抽象的数据提供者。只要您能够提供一个Func<IDataProvider>代表或其他代表,您就不需要任何派生类。

+0

我想通过构造函数注入将'IDataProvider'注入到消费者中。但是,如果我不会有派生类,并且不会在ninject模块中指定具体绑定,那么base class将如何知道使用了哪个'IDatabaseConnectionStringProvider'实现? –

+0

但连接字符串提供程序是数据提供程序的构造函数参数。消费者不必知道它。 Ninject支持更细粒度的设置。您可以参考他们的文档获取详细信息:https://github.com/ninject/Ninject/wiki/Contextual-Binding –