也许这很简单,但我迷路了。我正在编写一个小应用程序,它应该从数据库中读取数据,将数据导出到CSV,最后将其上传到服务器。那很简单。
由于阅读和导出的职责完全不同,我创建了IDataFeeder
(以检索数据)和IDataExporter
(创建CSV并上传)。
public interface IDataFeeder
{
DataTable GetData();
}
public interface IDataExporter
{
bool ExportData(DataTable data);
}
public class DataFeeder : IDataFeeder {}
public class DataExporter : IDataExporter {}
DataFeeder.GetData()
将使用ADO.NET代码。 DataExporter.ExportData()
方法将执行:
// dataFeeder <- ctor injection
dataFeeder.GetData("<stored_proc_1>"); // Problem
dataFeeder.GetData("<stored_proc_2>");
// generate csv
// upload csv
问题:
我不能/不想要IDataFeeder.GetData(string sproc)
因为那将成为特定于数据库的。如果有时我要从固定路径文件中读取数据,我将不需要这个参数。
答案 0 :(得分:0)
据我所知,您总是希望读取相同的数据/执行相同的存储过程。你为什么不这样实施GetData()
:
public DataTable GetData() {
execute <stored_procedure_1>;
execute <stored_procedure_2>;
return whatever;
}
我还无法发表评论,如果这个答案没有帮助,抱歉。
答案 1 :(得分:0)
如您在问题开头所述,保持接口的GetData方法无参数。有不同的IDataFeeder接口实现在初始化时通过构造函数获取特定于域的参数(如connectionstrings,db names等),这样就可以保留通用接口。
答案 2 :(得分:0)
实现这一目标的一种方法是使用抽象类。然后,您可以创建适合您需要的任何类型数据馈送器的特定实现。
public abstract class DataFeederBase : IDataFeeder
{
public abstract DataTable GetData();
}
public class DataFeederByString : DataFeederBase
{
private string _storedProcedure = string.Empty;
public DataFeederByString(string storedProcedure)
{
_storedProcedure = storedProcedure;
}
public override DataTable GetData()
{
//Implementation using stored procedure string
return new DataTable();
}
}
public class DataFeederByFixedPath : DataFeederBase
{
public override DataTable GetData()
{
//Implement using fixed path
return new DataTable();
}
}
然后在UI中使用
var feederByString = new DataFeederByString("mystring");
feederByString.GetData();
var feederByFixedPath = new DataFeederByFixedPath();
feederByFixedPath.GetData();
希望有所帮助。
答案 3 :(得分:0)
创建一个扩展IDataFeeder的抽象类,如下所示
public abstract class AbstractDataFeeder implements IDataFeeder{
// assuming that your data is a list of string
public abstract List<String> fetchData(Object...args);
}
public class DBDataFeeder extends AbstractDataFeeder{
// override fetchData
public List<String> fetchData(Object...args){
}
}
public class FileDataFeeder extends AbstractDataFeeder{
// override fetchData
public List<String> fetchData(Object...args){
}
}
现在定义DBDataFeeder和FileDataFeeder的属性,然后覆盖提取数据,传递所需的任何参数。