Расширение (альтернатива) шаблона проектирования хранилища? - PullRequest
1 голос
/ 23 апреля 2019

Я работаю над проектом в ASP.NET MVC.Я хочу создать уровень абстракции между уровнем доступа к данным и уровнем бизнес-логики приложения.Я работал с репозиторием и отделом работы.Для обзора, в этом шаблоне создается общий репозиторий и ряд конкретных репозиториев.Проблема, с которой я столкнулся в этом проекте, заключается в том, что мне нужен метод какого-то определенного репозитория в другом репозитории.Например, у меня есть репозиторий Product and Subproduct.Я хочу использовать методы Subproduct внутри методов Product вместо того, чтобы каждый раз переписывать LINQ Queries for Subproduct.Есть ли способ расширить функциональность шаблона проектирования хранилища, или мне нужно использовать другой шаблон проектирования?

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 голосов
/ 24 апреля 2019

Вы уже сказали в своем вопросе, что у вас есть Business Logic Layer.Это лучшее место для управления этими вещами.

Итак, вы не называете один репозиторий другим.Вместо этого вы вызываете два хранилища в одном методе из BLL для достижения цели.Надеюсь, ваш UoW подвергается воздействию BLL.Таким образом, в одной и той же области действия UoW вы выполняете оба действия.

Это не ограничивается только Get записью записей.Это может быть расширено до Get - Modify - Update или чего-либо еще.

Я не уверен, что делает ваш CheckSomeCondition.Если это просто Предикат, то это нормально.Если это часть бизнес-логики, лучше перевести ее на BLL, как я уже говорил выше.

0 голосов
/ 23 апреля 2019

Самый простой способ - заставить 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;
}
...