абстрактный контроллер подключен к хранилищу с использованием ограничений - asp.net core 2 - PullRequest
0 голосов
/ 01 июля 2018

В моей базе данных есть несколько таблиц для хранения информации об устройствах. Все они с очень похожими функциональными возможностями и полями, но все они имеют несколько специфических потребностей.

Для этого решения я создал проект данных, где я написал доступ к базе данных и модели. Мой интерфейс для общих полей таблицы:

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 определяет каждый репозиторий, поэтому я могу использовать эти контроллеры.

Есть предложения? Спасибо всем!

...