Внедрение зависимостей ядра MVC: ошибка общего параметра в репозитории интерфейса - PullRequest
0 голосов
/ 30 мая 2018

Я прочитал много книг и статей о stackoverflow.Все еще получаю ошибку ниже.Вот мой основной набросок интерфейса, хранилища с общим параметром.У меня есть AddTransient в моем Startup.cs.

В контроллере я пытаюсь ссылаться на интерфейс, не обращаясь к имени репозитория.У меня была штука, работающая без общего параметра.Как только я реализовал общий параметр, я получаю сообщение об ошибке ниже.Я хочу сослаться на Интерфейс, не ссылаясь на Репозиторий или Модель, так как мы можем перейти от RelationalDB к MongoDB позже и т. Д. Как мне избавиться от этой ошибки?

Интерфейс:

public interface IProductRepository<T>: IDisposable where T:class
{
    IEnumerable<T> GetProductDetail();

Репозиторий:

public class ProductRepository: IProductRepository<ProductdbData>
{
     IEnumerable<ProductdbData> GetProductDetail(); 

Startup.cs

services.AddTransient(typeof(IProductRepository<>), typeof(ProductRepository));

Ошибка веб-страницы контроллера:

namespace CompanyWeb.Controllers
{
    public class ProductController: Controller
    {
        private IProductRepository _productwebrepository; // this line gives error

Сообщение об ошибке: Ошибка CS0305 Использование универсального типа 'IProductRepository' требует аргументов 1 типа

1 Ответ

0 голосов
/ 30 мая 2018

Сообщение об ошибке

Сообщение об ошибке сообщает вам, в чем именно заключается проблема.Отсутствует параметр типа.Просто добавьте его :) Кроме того, предоставленный код ошибки CS0305 является идеальным кандидатом для поиска в Google.

docs.microsoft.com гласит следующее:

Эта ошибка возникает, когда ожидаемое количество аргументов типа не найдено.Чтобы решить C0305, используйте необходимое количество аргументов типа.

Возможные решения

Существует несколько способов решения проблемы.

1.Удаление универсального параметра

Если вы планируете предоставить только один тип продукта, пропустите универсальный параметр полностью, и ошибка исчезнет.Дополнительно вы удалите ненужную сложность.

Interace

public interface IProductRepository: IDisposable
{
    IEnumerable<ProductdbData> GetProductDetail();

Startup.cs

services.AddTransient<IProductRepository, ProductRepository>();

Контроллер:

namespace CompanyWeb.Controllers
{
    [Route("api/[controller]")]
    public class ProductController : Controller
    {
        private IProductRepository _ProductRepository;

        public ProductController(IProductRepository productRepository)
        {
            _ProductRepository = productRepository;
        }

2.Сохранение универсального параметра

Если вы решите придерживаться универсального параметра, вам действительно нужно исправить контроллер и интерфейс и передать параметр универсального типа в обоих местах.

Startup.cs

services.AddTransient<IProductRepository<ProductdbData>, ProductRepository>();

Контроллер:

namespace CompanyWeb.Controllers
{
    [Route("api/[controller]")]
    public class ProductController : Controller
    {
        private IProductRepository<ProductdbData> _ProductRepository;

        public ProductController(IProductRepository<ProductdbData> productRepository)
        {
            _ProductRepository = productRepository;
        }
...