我目前正在开发一个 C# 程序,该程序从 Excel 文件中读取测量数据,将它们解析为对象并提供将它们插入数据库的可能性(顺便说一句,我正在使用 NHibernate。)
该程序将有一个 GUI 实现。测量数据有多种形式。(来自电机的数据或来自配电盘的数据)。问题是,我只想定义一个表单类(GUI 窗口),而不管测量数据是什么。
我有两个解析器,MotorParser 和 SwitchboardParser,它们都有一个名为IList ParseDataTableToList(DataTable dataTable, DBConnectionWrapper dBCon)的方法,其中 T 是 Motor 对象或 Switchboard 对象。所以,我的想法是创建一个带有泛型的接口,它将由这两个类实现:
public interface IParser<T>
{
IList<T> ParseDataTableToList(DataTable dataTable, DBConnectionWrapper dBCon);
}
另一方面,我确实有数据库存储库,它实现了一个方法void InsertOrUpdate(T list),其中 T 再次是电机或 Switchboard 对象。我还为此实现了一个接口:
public interface IInsertOrUpdateList<T>
{
void InsertOrUpdate(IList<T> list);
}
好的,现在的想法是转发一个特定的 IInsertOrUpdateList 对象(MotorRepository 或 SwitchboardRepository)和一个 IParser(MotorParser 或 SwitchboardParser)。前面提到的 Form 类(我称之为ImportView)应该只使用这些接口。问题是,我不知道在使用泛型时这是否可能或如何可能。
这是我如何考虑实现的无效语法:
public partial class ImportView : Form
{
private IParser parser;
private IInsertOrUpdateList repository;
private dataToParse;
public ImportView(DataTable dataToParse, IParser parser, IInsertOrUpdateList repository)
{
this.parser = parser;
this.repository = repository;
this.dataToParse = dataToParse;
}
public void ParseAndInsertIntoDB()
{
repository.InsertOrUpdateList(parser.ParseDataTableToList(dataToParse, null));
}
}
当我实例化此窗口时,我将提供确定这是电机还是配电盘对象的测量数据的对象:
ImportView = new ImportView(dataToParse, new MotorParser(), new MotorRepository());
或者
ImportView = new ImportView(dataToParse, new SwitchboardParser(), new SwitchboardRepository());
有没有办法让我意识到泛型的问题,或者我的方法完全错误?我对任何想法都持开放态度。