无法隐式转换类型 - Autofac C# & ASP.NET MVC

Cannot Implicilty Convert Type - Autofac C# & ASP.NET MVC

我有一个相当简单的 ASP.NET MVC 应用程序,我试图解决我的控制器中的一些依赖项。我在使用 List 时遇到了问题,现在我不确定该怎么做。我已经阅读了有关 Autofac 的 Resolve() 方法,但我再次不确定这是否会解决我的特定问题。

这是我的控制器代码:

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));
}

在浏览器中出现此错误:

The type 'System.Collections.Generic.List1[BusinessLayer.NumbersModel]' is not assignable to service 'System.Collections.Generic.List1[[BusinessLayer.INumbersModel, BusinessLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'.

您应该只需要注册您的 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));
}

并将您的界面更改为 class:

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,因此不需要进行任何更改。

只需要注入两个参数

        private INumbersModel _model;
        private INumbersBusinessLayer _numbersBusinessLayer;

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

无需注册 NumbersModel 列表,注释掉这一行并重试

  builder.RegisterType<List<NumbersModel>>().As<List<INumbersModel>>();