я новичок в шаблоне проектирования репозитория, и я зашел в тупик, пытаясь реализовать его в отношении наследования.
Я не уверен, даже если я начал в правильном направлении.
Таким образом, в основном у меня будет абстрактный базовый класс 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 не может быть контравариантным и ковариантным одновременно, а разделение методов на два интерфейса кажется нелогичным. и громоздкий.
Я подозреваю, что мне понадобится фабричный шаблон, чтобы получить интерфейс базового класса, но я открыт для предложений и по этому поводу. Как я уже сказал, я новичок в отношении шаблона репо.
Мне любопытно, что я делаю не так, как я могу решить эту проблему и как я могу это лучше реализовать.
Спасибо.