根据类型调用 DAL 方法
本文关键字:DAL 方法 调用 类型 | 更新日期: 2023-09-27 18:31:43
我正在开发一个应用程序,我需要根据调用类的泛型类型调用两个数据方法之一。例如,如果 T 是 Foo 类型,我将调用数据。GetFoo():
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
return data.GetFoo(mostRecentProcessedReadTime); // Notice GetFoo()
}
}
如果 T 是 Bar 类型,我将调用数据。获取栏():
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
return data.GetBar(mostRecentProcessedReadTime); // Notice GetBar()
}
}
在此之前,我只需要一个 DAL 方法,因为所有类型都以相同的方式检索。我现在需要调用两个方法之一,具体取决于 T 的类型。
我试图避免这样的事情:
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (MesReportingDal data = new MesReportingDal())
{
if (T is Foo) { return data.GetFoo(mostRecentProcessedReadTime); }
if (T is Bar) { return data.GetBar(mostRecentProcessedReadTime); }
}
}
这违反了 OCP。有没有一种优雅的方法来处理这个问题,这样我就可以摆脱我的 if 语句?
编辑 - 这是类型的外观
public partial class Foo1 : IDataEntity { }
public partial class Foo2 : IDataEntity { }
public partial class Bar1 : IDataEntity { }
public partial class Bar2 : IDataEntity { }
这些 Foos 和 Bar 是与 Linq-to-SQL 一起使用的 DBML 项。
我会将GetFoo
和GetBar
更改为仅Get
,并MesReportingDal
也成为泛型。
所以我想你最终会得到这样的东西:
private static List<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (var data = new MesReportingDal<T>())
{
return data.Get(mostRecentProcessedReadTime);
}
}
顺便说一下,拥有 using
语句还需要MesReportingDal
实现IDisposable
,否则你会得到以下编译错误:
"MesReportingDal":using 语句中使用的类型必须隐式转换为"System.IDisposable"
更新
因此,在进一步考虑并阅读您的反馈之后,您有一个选择是提取存储库接口并将创建推送回工厂方法。 这将允许您维护单个data.Get(...)
调用,但基于T
使用不同的实现
public interface IRepository<T> : IDisposable
{
IList<T> Get(DateTime mostRecentRead);
}
public class FooRepo : IRepository<Foo>
{
public IList<Foo> Get(DateTime mostRecentRead)
{
// Foo Implementation
}
}
public class BarRepo : IRepository<Bar>
{
public IList<Bar> Get(DateTime mostRecentRead)
{
// Bar Implemenation
}
}
然后,您的工厂可能看起来像这样
public class RepositoryFactory
{
public static IRepository<T> CreateRepository<T>()
{
IRepository<T> repo = null;
Type forType = typeof(T);
if (forType == typeof(Foo))
{
repo = new FooRepo() as IRepository<T>;
}
else if (forType == typeof(Bar))
{
repo = new BarRepo() as IRepository<T>;
}
return repo;
}
}
这将允许您保持初始代码块干净
private static IList<T> GetObjectList(DateTime mostRecentProcessedReadTime)
{
using (var data = RepositoryFactory.CreateRepository<T>())
{
return data.Get(mostRecentProcessedReadTime);
}
}
希望有帮助。