无法隐式转换类型 - 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));
}

在浏览器中,我得到此错误:

类型'System.Collections.Generic.Generic.List 1[BusinessLayer.NumbersModel]' is not assignable to service 'System.Collections.Generic.List 1 [[[BusinessLayer.InumbersModel,businesslayer,version = 1.0.0.0,culture =中性,public keytrekeytoken = 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));
}

并将您的接口更改为类:

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

由于您的BusinessLayer接口已经期望Numbersmodel,但不需要INumbersmodel,因此不需要更改。

只需要两个参数

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

并且无需注册数字模型列表,请评论此行,然后重试

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

最新更新