扩展(替代)存储库设计模式?

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

我正在ASP.NET MVC中的一个项目。我想在数据访问层和应用程序的业务逻辑层之间创建一个抽象层。我一直在使用Repository和Unit of work。要检查,在此模式中,将创建一个通用存储库和一些特定存储库。我在这个项目中遇到的问题是我需要另一个存储库中某个特定存储库的方法。例如,我有一个Product和Subproduct存储库。我想在Product方法中使用Subproduct方法,而不是每次都重写子产品的LINQ查询。有没有办法扩展存储库设计模式的功能,或者我必须使用另一种设计模式?

public class ProductSubcategoryRepository : Repository<ProductSubcategory>, IProductSubcategoryRepository
{
    public ProductSubcategoryRepository(DbContext context) : base(context)
    {
    }

    public IEnumerable<ProductSubcategory> CheckSomeCondition()
    {
        // LINQ to check some condition based on product subcategory
    }
}

public class ProductCategoryRepository : Repository<ProductCategory>, IProductCategoryRepository
{
    public ProductCategoryRepository(DbContext context) : base(context)
    {

    }

    public IEnumerable<ProductCategory> GetProductCategoriesBeforeDate()
    {
        // Repeated LINQ to check some condition based on product subcategory 
        // (I am looking for a way to call the same method of ProductSubCategory calss)

        // LINQ To return List of product category if the previous query is true
    }
}
c# asp.net-mvc design-patterns repository repository-pattern
2个回答
0
投票

您已经在问题中说过您已经有了业务逻辑层。这是管理这些东西的最佳场所。

因此,您不会在其他存储库中调用一个存储库。相反,您在BLL的一个方法中调用两个存储库来实现目标。希望您的UoW接触BLL。这样,在UoW的相同范围内,您可以执行这两个操作。

这不仅限于Getting记录。这可以进一步扩展到Get-Modify-Update或其他什么。

我不确定你的CheckSomeCondition做了什么。它只是一个谓词然后就好了。如果它是某些业务逻辑的一部分,更好的方法是将其转换为BLL,如上所述。


0
投票

最直接的方法是让ProductCategoryRepository在其构造函数中创建一个ProductSubcategoryRepository实例:

public class ProductCategoryRepository : Repository<ProductCategory>, IProductCategoryRepository
{
    private ProductSubcategoryRepository subRepo;
    public ProductCategoryRepository(DbContext context) : base(context)
    {
        subRepo = new ProductSubcategoryRepository(context);
    }

    public IEnumerable<ProductCategory> GetProductCategoriesBeforeDate()
    {
        // call subRepo
    }
}

如果你已经有ProductSubcategoryRepository的实例,你可以注入它:

public ProductCategoryRepository(DbContext context, ProductSubcategoryRepository subRepo) : base(context)
{
    this.subRepo = subRepo;
}
© www.soinside.com 2019 - 2024. All rights reserved.