Шаблон репозитория и наследование в. net

я новичок в шаблоне проектирования репозитория, и я зашел в тупик, пытаясь реализовать его в отношении наследования.

Я не уверен, даже если я начал в правильном направлении.

Таким образом, в основном у меня будет абстрактный базовый класс Product, например, с id и imagePath, и несколько продуктов, унаследованных от этого.

namespace Common
{
    public abstract class Product
    {
        public int Id { get; set; }
        public string ImgPath { get; set; }
    }

    public class Scale : Product
    {
        public int AdditionalProperty { get; set; }
    }
}

Теперь репозитории выглядят следующим образом:

public class BaseRepository
{
    protected TEstEntities1 _dataContext = new TEstEntities1();

    public BaseRepository()
    {
        _dataContext = new TEstEntities1();
    }
}

public interface IProductRepository 
{
    Common.Product Get(int id);
    void Add(Common.Product p);
    void Update(Common.Product p);
    List<Common.Product> ListAll();
}

public class ProductRepository : BaseRepository, IProductRepository
{
    public Common.Product Get(int id)
    {
        throw new NotImplementedException();
    }

    public void Add(Common.Product p)
    {
        throw new NotImplementedException();
    }

    public void Update(Common.Product p)
    {
        throw new NotImplementedException();
    }

    public List<Common.Product> ListAll()
    {
        throw new NotImplementedException();
    }
}

Моя проблема заключается в следующем: как интегрировать операции, связанные с масштабированием? Кажется плохой идеей добавлять что-то вроде Add (Common.Scale s) в IProductRepository. Заглядывать внутрь Add (Common. Если я использую фабричный шаблон для возврата IProductRepository и внутри него создаю экземпляр с IProductRepository, это не сработает из-за ковариантности и контравариантности, а IProductRepository не может быть контравариантным и ковариантным одновременно, а разделение методов на два интерфейса кажется нелогичным. и громоздкий.

Я подозреваю, что мне понадобится фабричный шаблон, чтобы получить интерфейс базового класса, но я открыт для предложений и по этому поводу. Как я уже сказал, я новичок в отношении шаблона репо.

Мне любопытно, что я делаю не так, как я могу решить эту проблему и как я могу это лучше реализовать.

Спасибо.

6
задан ImmoralWombat 27 April 2011 в 20:43
поделиться