就我个人而言,我会选择 lambda 方式。这可能是因为我喜欢 lambda,但它为通用存储库设置提供了很多空间。
考虑到以下几点:
bannerRepository.Find.Where(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner)
我不知道你的模式是什么样的,但你可以在这里重构一些东西:
创建一个名为“IRepository”的通用接口,该接口包含所有数据访问方法。
它可能看起来像这样:
interface IRepository<T> where T : class
{
IEnumerable<T> FindAll(Func<T, bool> exp);
T FindSingle(Func<T, bool> exp);
}
创建一个实现此接口的抽象“存储库”类:
class Repository<T> : IRepository<T> where T : class
{
TestDataContext _dataContext = TestDataContext();
public IEnumerable<T> FindAll(Func<T, bool> exp)
{
_dataContext.GetTable<T>().Where<T>(exp);
}
public T FindSingle(Func<T, bool> exp)
{
_dataContext.GetTable<T>().Single(exp);
}
}
我们现在可以为实现我们的“IRepository”的横幅表/对象创建一个接口,以及一个扩展抽象“Repository”类并实现“IBannerInterface”的具体类:
interface IBannerRepository : IRepository<Banner>
{
}
以及实现它的匹配存储库:
class BannerRepository : Repository<Banner>, IBannerRepository
{
}
我建议使用这种方法,因为它为您提供了很大的灵活性以及足够的能力来控制您拥有的所有微小实体。
这样调用这些方法将非常容易:
BannerRepository _repo = new BannerRepository();
_repo.FindSingle(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner);
是的,这意味着您必须做一些工作,但稍后更改数据源会更容易。
希望能帮助到你!