Надеюсь, название описывает проблему, мне не удалось сформулировать проблему, которую я пытаюсь решить.
Я использую .NET Core 2.1
Я недавно начал работать в магазине C # после работы с Python в течение последних 5 лет, так что мой строго типизированный упс немного ржавый. Вот что у меня есть и что я пытаюсь сделать:
I Базовый интерфейс репозитория, который определяет основные функции CRUD для объектов базы данных:
public interface IRepository<TEntity, TPrimaryKey> where TEntity : class
{
TEntity FindById(TPrimaryKey id)
void Create(TEntity entity);
void Delete (TEntity entity);
}
Я наследую от этого интерфейса, чтобы определить интерфейс, который реализует мой класс репозитория:
interface IProductRepository : IRepository<Product, int>
{
void SomeProductRepoMethod(int someParam);
}
Затем я реализую все методы интерфейса в моем конкретном классе:
public class ProductRepository : IProductRepository
{
public Product FindById(int id)
{
// lookup
}
public void Create(Product product)
{
// save
}
public void SomeProductRepoMethod(int someParam)
{
// do product repository specific stuff
}
....
}
Теперь то, что я хочу сделать, довольно просто. Я хочу добавить перегрузку Create
на IRepository
, которая занимает IEnumerable
из TEntity
:
public interface IRepository<TEntity, TPrimaryKey> where TEntity : class
...
void Create(IEnumerable<TEntity> entities);
...
Но я бы хотел определить реализацию этой перегрузки Once :
Так что я подумал, что смогу создать абстрактный базовый класс репозитория для реализации описанной выше реализации. Проблема, с которой я сталкиваюсь, заключается в том, что я не уверен, как или даже если бы я мог сделать это чисто с моделью, которая у меня сейчас Я попытался создать базовый класс, который реализует IRepository
, но это будет означать,
передача параметров типа в базовый класс и в интерфейс:
public abstract class BaseRepository<TEntity, TPrimaryKey> : IRepository<TEntity, TPrimaryKey>
{
public abstract TEntity FindById(TPrimaryKey id);
public abstract void Create(TEntity entity);
public abstract void Delete(TEntity entity);
public void Create(IEnumerable<TEntity> entities)
{
foreach(TEntity entity in entities)
{
Create(entity);
}
}
}
Тогда в моем конкретном хранилище:
public class ProductRepository : BaseRepository<Product, int>, IProductRepository
{
public override Product FindById(int id)
{
// lookup
}
public override void Create(Product product)
{
// save
}
public void SomeProductRepoMethod(int someParam)
{
// do product repository specific stuff
}
....
}
Мне это не кажется спокойным, поскольку я передаю параметры одного типа как в IProductRepository
, так и ProductRepository
. я чувствую
Я близок, но не там, и я не уверен, какой подход наилучшей практики здесь будет. Если бы кто-то мог предложить подход, я бы действительно
ценим обратную связь. Извиняюсь за длину поста, но я чувствовал, что должен четко описать, что я пытался сделать. Спасибо!