通用存储库扩展:继承与扩展方法

问题描述 投票:1回答:4

我计划在我的实体框架项目中使用通用存储库。但是,这对于扩展基本通用存储库不包含的操作的存储库更好。

继承:

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();
    }
}
c# entity-framework inheritance extension-methods repository-pattern
4个回答
4
投票

不要在存储库上创建查询方法。使用存储库来维护聚合一致性,而不是用于通用查询。否则,您的界面会非常膨胀,并且您的存储库只会成为无数不同查询的垃圾场。只需创建查询和查询处理程序即可。我只使用存储库来获取要更新的数据。

执行this之类的操作。

这是一种更多的SOLID方法。


0
投票

我会继承。

我认为,扩展方法是合适的,当您想向类添加功能而无法控制时(例如字符串扩展),或者想为接口提供功能,无论使用哪种功能,都应该做同样的事情当前正在使用的实现(例如LINQ是IEnumerable的一组扩展)

在这种情况下,说“这是我的CustomerRepository,并且CustomerRepository有一些额外的东西或做的东西与默认行为有些不同,但是最终,客户的存储库是] >存储库。

请注意,这都是很主观的,并且基于个人喜好,但是我的投票权是继承路线。


0
投票

我通常走了继承路线。这看起来和您所灌输的非常相似。我有一个通用的“基础”存储库实现,将IUnitOfWork注入其中。然后,在每个BaseRepository继承类中,我将实现查询。这是我使用此“模式”的较旧版本发布的较旧帖子:https://stackoverflow.com/a/18788895/1426342


0
投票

[旧文章,但是我想在扩展名更合适时添加一点-当您通过DI容器解析依赖项并且您有[[0]]个Repositories时。在这种情况下,您只需要注册您的通用仓库,而不必分别注册每个仓库。

© www.soinside.com 2019 - 2024. All rights reserved.