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

时间:2019-04-23 06:11:53

标签: c# asp.net-mvc design-patterns repository repository-pattern

我正在使用ASP.NET MVC开发一个项目。我想在应用程序的数据访问层和业务逻辑层之间创建一个抽象层。我一直在使用存储库和工作单元。为了进行检查,以这种模式创建了一个通用存储库和许多特定存储库。我在这个项目中面临的问题是,我需要另一个存储库中某个特定存储库的方法。例如,我有一个产品和子产品存储库。我想在Product方法中使用Subproduct方法,而不是每次都重写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
    }
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您已经在问题中说过您已经具备业务逻辑层。那是管理这些东西的最佳位置。

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

这不仅限于Get设置记录。可以进一步扩展到Get-Modify-Update或其他任何形式。

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