В моей базе данных есть несколько таблиц для хранения информации об устройствах. Все они с очень похожими функциональными возможностями и полями, но все они имеют несколько специфических потребностей.
Для этого решения я создал проект данных, где я написал доступ к базе данных и модели.
Мой интерфейс для общих полей таблицы:
public interface IInstrumento
{ /* Common properties here */ }
Мои модели объявлены так:
public class Motor : IInstrumento
{ /* Model specific properties + interface properties here */ }
Эта модель работает и может использоваться для соединения с базой данных с использованием DbContext.
Затем я создал бизнес-проект, включающий репозитории CRUD. Я написал интерфейс для этого:
public interface IInstrumentoRepository<TModel> where TModel : IInstrumento
{
string Add(TModel obj);
TModel Get(string id);
IQueryable<TModel> GetAll();
int Update(TModel obj);
int Delete(TModel obj);
}
И конкретные репозитории для каждой модели:
public class MotorRepository : IInstrumentoRepository<Motor>
{
private MyContext context = new MyContext();
public string Add(Motor obj) { ... }
/* etc. */
}
Все это сработало для меня. Моя проблема началась, когда я попытался создать абстрактный контроллер для этого. Поскольку все они имеют одинаковую функциональность, единственное, что мне нужно изменить, - это представления и способ создания ViewModels, что я могу сделать в каждом подклассе.
Мой абстрактный контроллер выглядит так:
public abstract class InstrumentosController<T> : Controller
where T : class, IInstrumentoRepository<IInstrumento>
{
protected readonly T repo;
public InstrumentosController(T repo)
{
this.repo = repo;
}
/* Methods might be not abstract */
public abstract IActionResult Index();
/* ... More methods here */
}
Когда я пытаюсь создать контроллер ...
public class MotoresController : InstrumentosController<MotorRepository>
{
public MotoresController(MotorRepository repo)
: base(repo)
{ }
public override IActionResult Index() { ... }
}
... Я получаю ошибку компиляции:
Тип «... MotorRepository» нельзя использовать в качестве параметра типа «T» в универсальном типе или методе «InstrumentosController». Не существует неявного преобразования ссылок из 'MotorRepository' в 'IInstrumentoRepository <.... Models.IInstrumento>'.
Конечно, класс Startup определяет каждый репозиторий, поэтому я могу использовать эти контроллеры.
Есть предложения? Спасибо всем!