我正在使用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
}
}
答案 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,如我上面所述。