我计划在我的实体框架项目中使用通用存储库。但是,这对于扩展基本通用存储库不包含的操作的存储库更好。
继承:
public class CustomerRepository:Repository<Customer>
{
public decimal GetCustomerOrderTotalByYear(int customerId, int year)
{
return base
.FindById(customerId)
.Orders.SelectMany(o => o.OrderDetails)
.Select(o => o.Quantity*o.UnitPrice).Sum();
}
}
扩展方法:
public static class CustomerRepositoryExtensions
{
public static decimal GetCustomerOrderTotalByYear(this Repository<Customer> customerRepository, int customerId, int year)
{
return customerRepository
.FindById(customerId)
.Orders.SelectMany(o => o.OrderDetails)
.Select(o => o.Quantity*o.UnitPrice).Sum();
}
}
我会继承。
我认为,扩展方法是合适的,当您想向类添加功能而无法控制时(例如字符串扩展),或者想为接口提供功能,无论使用哪种功能,都应该做同样的事情当前正在使用的实现(例如LINQ是IEnumerable的一组扩展)
在这种情况下,说“这是我的CustomerRepository,并且CustomerRepository有一些额外的东西或做的东西与默认行为有些不同,但是最终,客户的存储库是] >存储库。
请注意,这都是很主观的,并且基于个人喜好,但是我的投票权是继承路线。
我通常走了继承路线。这看起来和您所灌输的非常相似。我有一个通用的“基础”存储库实现,将IUnitOfWork注入其中。然后,在每个BaseRepository继承类中,我将实现查询。这是我使用此“模式”的较旧版本发布的较旧帖子:https://stackoverflow.com/a/18788895/1426342
[旧文章,但是我想在扩展名更合适时添加一点-当您通过DI容器解析依赖项并且您有[[0]]个Repositories
时。在这种情况下,您只需要注册您的通用仓库,而不必分别注册每个仓库。