Шаблон репозитория Вопрос и дженерики? - PullRequest
2 голосов
/ 03 февраля 2011

Мне нужна помощь с проблемой проектирования (шаблон проектирования репозитория) в C #. У меня есть система с несколькими типами «продуктов». Каждый продукт имеет функцию поиска. Я хочу разработать многоразовый / универсальный интерфейс поиска. В зависимости от продукта, критерии поиска будут отличаться, а также возвращаемые данные.

Функция поиска будет искать только в пределах определенного типа продукта. На данный момент Поиск является единственной функцией, но в будущем могут появиться другие функции, такие как «GetByID», которые также будут вести себя по-разному в зависимости от типа.

Вначале я думал о создании интерфейса «product» с функцией «DoSearch: function

».
public interface IProduct
{
   [return type?] DoSearch([paramters?]);
   ...
}

public class Product1 : IProduct
{
    [product1 result] DoSearch([parameters?])
    {
          //Do searching logic
         return [product1 result]
    }
}

тогда у меня был бы "бизнес" класс

public class ProductBusiness
{
    IProduct _product;

    public ProductBusiness(IProduct product)
    {
      _product = product
    }


   public [return type?] DoSearch([parameters])
   {
      return _product.DoSearch([paramters]);
   }
}

Моя проблема в том, как сделать [параметры] и [тип возвращаемого значения] в бизнес-классе «универсальными», поскольку в зависимости от типа продукта параметры и тип возвращаемого значения могут различаться?

код клиента, использующий это, будет выглядеть примерно так:

ProductBusiness productBusiness = new ProductBusiness(new Product1());
[product1 result] = productBusiness.DoSearch[parameters]);

...process result code

1 Ответ

5 голосов
/ 03 февраля 2011

Я бы реализовал что-то вроде этого. Он достаточно общий, и большая часть кода может быть реализована в базовом классе для хранилища.

public interface IRepository<T> where T: IProduct
{
   IEnumerable<T> Search(Predicate<T> query)
   IEnumerable<T> Search(IEnumerable<Predicate<T>> query>

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...