Не может подразумевать конвертируемый тип - Autofac C # и ASP.NET MVC - PullRequest
0 голосов
/ 25 мая 2019

У меня довольно простое приложение ASP.NET MVC, в котором я пытаюсь разрешить некоторые зависимости в моем контроллере. У меня проблемы с кастомом List, и я не уверен, что делать в данный момент. Я читал о методе Resolve() с Autofac, но опять же я не уверен, что это решит мою конкретную проблему.

Вот мой код контроллера:

public class NumbersController : Controller
{
    private INumbersModel _model;
    private INumbersBusinessLayer _numbersBusinessLayer;
    private IEnumerable<INumbersModel> _modelList;

    public NumbersController(INumbersModel model, IEnumerable<INumbersModel> modelList, INumbersBusinessLayer numbersBusinessLayer)
    {
        _model = model;
        _numbersBusinessLayer = numbersBusinessLayer;
        _modelList = new List<INumbersModel>(modelList);
    }

    public ActionResult Index()
    {
        _modelList = _numbersBusinessLayer.AllNumbers.ToList();
        return View(_modelList);
    }    

    [HttpGet]
    public ActionResult Edit(int id)
    {
        _model = _numbersBusinessLayer.AllNumbers.Single(n => n.ID == id);
        return View(_model);
    }
}

Вот мои два интерфейса:

public interface INumbersBusinessLayer
{
        IEnumerable<NumbersModel> AllNumbers { get; }

        void AddNumbers(NumbersModel model);
        void DeleteNumbers(int id);
        void UpdateNumbers(NumbersModel model);
}

public interface INumbersModel
{
        int ID { get; set; }
        bool IsValid { get; set; }
        string Numbers { get; set; }
        string Order { get; set; }
        string Time { get; set; }
}

Вот мой конфиг контейнера:

public static void ConfigureDependencyInjection()
{
    var builder = new ContainerBuilder();

    // ...or you can register individual controlllers manually.
    builder.RegisterType<NumbersController>().InstancePerRequest();

    // register models
    builder.RegisterType<NumbersModel>().As<INumbersModel>();
    builder.RegisterType<List<NumbersModel>>().As<List<INumbersModel>>();
    builder.RegisterType<NumbersBusinessLayer>().As<INumbersBusinessLayer>();

    IContainer container = builder.Build();

    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

В браузере я получаю эту ошибку:

Тип 'System.Collections.Generic.List 1[BusinessLayer.NumbersModel]' is not assignable to service 'System.Collections.Generic.List 1 [[BusinessLayer.INumbersModel, BusinessLayer, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = ноль]]'.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Необходимо ввести только два параметра

        private INumbersModel _model;
        private INumbersBusinessLayer _numbersBusinessLayer;

        public NumbersController(INumbersModel model,INumbersBusinessLayer numbersBusinessLayer)
        {
            _model = model;
            _numbersBusinessLayer = numbersBusinessLayer
        }

и нет необходимости регистрировать список NumbersModel, прокомментируйте эту строку и повторите попытку

  builder.RegisterType<List<NumbersModel>>().As<List<INumbersModel>>();
1 голос
/ 25 мая 2019

Вам нужно всего лишь зарегистрировать свой INumbersBusinessLayer, так как это единственное, что вам действительно нужно ввести в ваш контроллер.

Кроме того, измените INumbersModel на class, чтобы вы могли его использовать.

Таким образом, ваш контроллер выглядит следующим образом:

public class NumbersController : Controller
{
    private INumbersBusinessLayer _numbersBusinessLayer;

    public NumbersController(INumbersBusinessLayer numbersBusinessLayer)
    {
        _numbersBusinessLayer = numbersBusinessLayer;
    }

    public ActionResult Index()
    {
       var  modelList = _numbersBusinessLayer.AllNumbers.ToList();

        return View(modelList);
    }

    [HttpGet]
    public ActionResult Edit(int id)
    {
        var model = _numbersBusinessLayer.AllNumbers.Single(n => n.ID == id);

        return View(model);
    }
}

Тогда вы можетеупростите настройку AutoFac:

public static void ConfigureDependencyInjection()
{
    var builder = new ContainerBuilder();
    // ...or you can register individual controlllers manually.
    builder.RegisterType<NumbersController>().InstancePerRequest();
    builder.RegisterType<NumbersBusinessLayer>().As<INumbersBusinessLayer>();

    IContainer container = builder.Build();

    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

и измените интерфейс на класс:

public class NumbersModel
{
    int ID { get; set; }
    bool IsValid { get; set; }
    string Numbers { get; set; }
    string Order { get; set; }
    string Time { get; set; }
}

Поскольку интерфейс вашего бизнес-уровня уже ожидает Numbersmodel, но не INumbersmodel, никаких изменений нетнужно там.

...