当只知道类实现的接口时,在类之间共享数据
本文关键字:之间 数据 共享 实现 接口 | 更新日期: 2023-09-27 18:21:16
我正在编写一个应用程序,该应用程序将把数据库中的一堆数据导出到具有特定文件结构的文件中。到目前为止,只定义了一种"类型"的导出,但还会有更多,所以我想让新的"类型"更容易插入。我定义了以下接口,所有导出"类型"都必须实现:
public interface IExportService
{
ExportType ExportType { get; set; }
Task DoExport(Store store);
}
ExportType
是一个枚举,Store
对象是一个客户(而不是某种数据存储)。
到目前为止,只有一个类实现了这个接口:RetailExportService
。
public class RetailExportService : IExportService
{
public ExportType Type
{
get { return ExportType.Retail; }
}
public async Task DoExport(Store store)
{
List<IRetailExport> retailExports = GetRetailExportFiles();
foreach (var retailExport in retailExports)
{
await retailExport.Export(store);
}
}
private List<IRetailExport> GetRetailExportFiles()
{
return (from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Contains(typeof(IRetailExport))
select Activator.CreateInstance(t) as IRetailExport).ToList();
}
}
这个类循环通过程序集中的所有IRetailExport
接口,并调用它的Export
方法。实际的数据查询和文件创建是用Export
方法完成的。
public interface IRetailExport
{
String FileName { get; }
Task Export(Store store);
}
因此,如果必须创建一个新文件,我只需创建一个实现IRetailExport
的新类,应用程序就会自动调用它。
我遇到的问题是,我有13个实现IRetailExport
的类,其中5个类需要相同的数据。目前,我正在查询每个类中的数据库,但这是个坏主意,会降低应用程序的速度。
我能想到的唯一方法是定义一个这样的接口:
public interface IDataRequired<T> where T: class
{
IEnumerable<T> Data { get; set; }
}
并使需要相同数据的类实现该类。在DoExport()
方法中,我可以检查这个类是否实现了IDataRequired——如果是,则填充Data属性:
public async Task DoExport(Store store)
{
List<IRetailExport> retailExports = GetRetailExportFiles();
List<ExpRmProductIndex> requiredData = await GetIndexedProductList(store.Id);
foreach (var retailExport in retailExports)
{
if (retailExport is IDataRequired<ExpRmProductIndex>)
(retailExport as IDataRequired<ExpRmProductIndex>).Data = requiredData;
await retailExport.Export(store);
}
}
然而,我不认为这是一个非常优雅的解决方案,所以我希望这里有人能提出一个更好的方法来解决这个问题?谢谢
在并行任务中读取或写入多个文件不是一个好主意,因为这会使磁盘头在文件之间多次跳跃,从而导致延迟。(我假设如果你有一个循环中的await
,就会发生这种情况。)
相反,按照严格的顺序依次处理一个文件和await
一次,以完成整个过程。