基于接口

时间:2017-03-10 14:05:09

标签: c# interface

也许这很简单,但我迷路了。我正在编写一个小应用程序,它应该从数据库中读取数据,将数据导出到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)因为那将成为特定于数据库的。如果有时我要从固定路径文件中读取数据,我将不需要这个参数。

4 个答案:

答案 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的属性,然后覆盖提取数据,传递所需的任何参数。