C# MVC自定义构造函数从未命中

C# MVC自定义构造函数从未命中,c#,asp.net-web-api,autofac,C#,Asp.net Web Api,Autofac,我正在使用Autofac for IoC,在我的控制器文件夹中包含2个控制器 class PokemonController : ApiController 及 我很确定我的IoC设置正确,因为PokemonController可以访问接口IPokemonRepositoryService很好,但是使用HomeController我的自定义构造函数从未被击中。仅命中默认的无参数ctor private readonly IPokemonRepositoryService _pokem

我正在使用Autofac for IoC,在我的控制器文件夹中包含2个控制器

class PokemonController : ApiController 

我很确定我的IoC设置正确,因为
PokemonController
可以访问接口
IPokemonRepositoryService
很好,但是使用
HomeController
我的自定义构造函数从未被击中。仅命中默认的无参数ctor

    private readonly IPokemonRepositoryService _pokemonRepositoryService;

    public HomeController()
    {

    }

    public HomeController(IPokemonRepositoryService pokemonRepositoryService)
    {
        _pokemonRepositoryService = pokemonRepositoryService;
    }
有人能帮我找出可能的原因以及如何修复它吗

异常堆栈跟踪

“/”应用程序中出现服务器错误。未定义无参数构造函数 对于这个对象。描述:过程中发生未处理的异常 当前web请求的执行。请检查堆栈 跟踪以获取有关错误及其来源的更多信息 密码

异常详细信息:System.MissingMethodException:无参数 为此对象定义的构造函数

源错误:

在执行过程中生成了未处理的异常 当前web请求。关于货物来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常

堆栈跟踪:

[MissingMethodException:没有为此定义无参数构造函数 对象。]System.RuntimeTypeHandle.CreateInstance(RuntimeType类型, Boolean publicOnly、Boolean noCheck、Boolean&canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔型 skipCheckThis,布尔填充缓存,堆栈爬网标记和堆栈标记)+122
System.RuntimeType.CreateInstanceDefaultCtor(仅限布尔值), 布尔skipCheckThis、布尔填充缓存、堆栈爬网标记和堆栈标记) +239 System.Activator.CreateInstance(类型类型,布尔非公共)+85 System.Activator.CreateInstance(类型)+12 System.Web.Mvc.DefaultControllerActivator.Create(请求上下文 requestContext,类型controllerType)+55

[InvalidOperationException:尝试创建时出错 “Pokemon.WebAPI.Controllers.HomeController”类型的控制器。使 确保控制器具有无参数公共构造函数。]
System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext,类型controllerType)+178
System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,类型controllerType)+80
System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,字符串控制器名称)+102
System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext、IController和controller、IControllerFactory和factory) +188 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,异步回调,对象状态)+50
System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext HttpContext, 异步回调,对象状态)+48
System.Web.Mvc.MvcHandler.System.Web.IHTTPassynchandler.BeginProcessRequest(HttpContext 上下文,异步回调,对象外部数据)+16
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +444 System.Web.HttpApplication.executesteppl(IExecutionStep步骤)+132 System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤 步骤,布尔值&同步完成)+163

编辑: 添加AutofacConfig

public class AutofacConfig
    {
        public static void Register()
        {
            var bldr = new ContainerBuilder();
            var config = GlobalConfiguration.Configuration;
            bldr.RegisterControllers(Assembly.GetAssembly(typeof(HomeController)));
            bldr.RegisterApiControllers(Assembly.GetAssembly(typeof(PokemonController)));
            RegisterServices(bldr);
            bldr.RegisterWebApiFilterProvider(config);
            bldr.RegisterWebApiModelBinderProvider();
            var container = bldr.Build();
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }

        private static void RegisterServices(ContainerBuilder bldr)
        {
            bldr.RegisterType<PokemonContext>()
                .InstancePerRequest();

            bldr.RegisterType<PokemonRepositoryService>()
                .As<IPokemonRepositoryService>()
                .InstancePerRequest();

            bldr.RegisterType<LevenshteinService>()
                .As<ILevenshteinService>()
                .InstancePerRequest();

            bldr.RegisterType<PokemonParseService>()
                .As<IPokemonParseService>()
                .InstancePerRequest();

            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new PokemonMapping());
            });

            bldr.RegisterInstance(config.CreateMapper())
                .As<IMapper>()
                .SingleInstance();
        }
    }
公共类AutofacConfig
{
公共静态无效寄存器()
{
var bldr=新的ContainerBuilder();
var config=GlobalConfiguration.Configuration;
bldr.RegisterController(Assembly.GetAssembly(typeof(HomeController));
bldr.registerapicontroller(Assembly.GetAssembly(typeof(PokemonController));
注册服务(bldr);
bldr.RegisterWebAPI过滤器提供程序(配置);
bldr.RegisterWebApiModelBinderProvider();
var container=bldr.Build();
config.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
}
专用静态无效注册表服务(ContainerBuilder bldr)
{
bldr.RegisterType()
.InstancePerRequest();
bldr.RegisterType()
.As()
.InstancePerRequest();
bldr.RegisterType()
.As()
.InstancePerRequest();
bldr.RegisterType()
.As()
.InstancePerRequest();
var config=new-MapperConfiguration(cfg=>
{
AddProfile(新的PokemonMapping());
});
bldr.RegisterInstance(config.CreateMapper())
.As()
.SingleInstance();
}
}

删除默认构造函数`HomeController()`一开始我没有默认的构造函数,但它返回一个MissingMethodException:没有定义无参数构造函数您是否在任何启动文件中注册了此构造函数?您不能提供异常堆栈跟踪吗?老实说,您的IoC设置似乎仍然不正确。您正在使用.NETCore吗?如果是这样,请检查您是否通过调用
builder.Populate()
使用Autofac填充了.NET Core DI服务,并且您也调用了
services.AddControllersWithViews()
。查看您如何注册这些类型也很有用。
public class AutofacConfig
    {
        public static void Register()
        {
            var bldr = new ContainerBuilder();
            var config = GlobalConfiguration.Configuration;
            bldr.RegisterControllers(Assembly.GetAssembly(typeof(HomeController)));
            bldr.RegisterApiControllers(Assembly.GetAssembly(typeof(PokemonController)));
            RegisterServices(bldr);
            bldr.RegisterWebApiFilterProvider(config);
            bldr.RegisterWebApiModelBinderProvider();
            var container = bldr.Build();
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
        }

        private static void RegisterServices(ContainerBuilder bldr)
        {
            bldr.RegisterType<PokemonContext>()
                .InstancePerRequest();

            bldr.RegisterType<PokemonRepositoryService>()
                .As<IPokemonRepositoryService>()
                .InstancePerRequest();

            bldr.RegisterType<LevenshteinService>()
                .As<ILevenshteinService>()
                .InstancePerRequest();

            bldr.RegisterType<PokemonParseService>()
                .As<IPokemonParseService>()
                .InstancePerRequest();

            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new PokemonMapping());
            });

            bldr.RegisterInstance(config.CreateMapper())
                .As<IMapper>()
                .SingleInstance();
        }
    }