MVC Пользовательский конструктор никогда не попадет - PullRequest
0 голосов
/ 20 февраля 2020

Я использую Autofa c для Io C, в моей папке контроллеров содержится 2 контроллера,

class PokemonController : ApiController 

и

class HomeController : Controller.

Я почти уверен, что у меня есть Io C настроен правильно, так как PokemonController имеет доступ к интерфейсу IPokemonRepositoryService просто отлично, но с HomeController мой пользовательский конструктор никогда не попадал. Был поражен только ctor без параметров по умолчанию.

    private readonly IPokemonRepositoryService _pokemonRepositoryService;

    public HomeController()
    {

    }

    public HomeController(IPokemonRepositoryService pokemonRepositoryService)
    {
        _pokemonRepositoryService = pokemonRepositoryService;
    }

Может кто-нибудь помочь мне выяснить, в чем может быть причина и как я могу это исправить?

Трассировка стека исключений

Ошибка сервера в «/» приложении. Для этого объекта не определен конструктор без параметров. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.MissingMethodException: для этого объекта не определен конструктор без параметров.

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информацию о происхождении и местонахождении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:

[MissingMethodException: для этого объекта не определен конструктор без параметров.] System.RuntimeTypeHandle. CreateInstance (тип RuntimeType, логическое значение publicOnly, логическое значение noCheck, логическое значение noCheck, логическое значение и canBeCached, RuntimeMethodHandleInternal & ctor, логическое значение & bNeedSecurityCheck) + 0
System.RuntimeType.CreateInstanceSlow (BoockMackleCleck) RuntimeType.CreateInstanceDefaultCtor (логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache, StackCrawlMark & ​​stackMark) +239 System.Activator.CreateInstance (тип Type, логический тип NonPubli c) + 85. Тип системы. Mvc .DefaultControllerActivator.Create (RequestContext requestContext, Тип controllerType) + 55

[InvalidOperationException: при попытке произошла ошибка создать контроллер типа 'Pokemon.WebAPI.Controllers.HomeController'. Убедитесь, что контроллер имеет конструктор publi c без параметров.]
System.Web. Mvc .DefaultControllerActivator.Create (RequestContext requestContext, Type controllerType) + 178
System.Web. Mvc .DefaultControllerFactory .GetControllerInstance (RequestContext requestContext, Тип controllerType) + 80
System.Web. Mvc .DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName) + 102
System.Web. Mvc .InxtBextPhttp. httpContext, IController & controller, IControllerFactory & factory) +188 System.Web. Mvc .MvcHandler.BeginProcessRequest (HttpContextBase httpContext, AsyncCallback обратный вызов, состояние объекта) + 50
System.Web. Mvc. HTMLTextHept , Обратный вызов AsyncCallback, состояние объекта) + 48
System.Web. Mvc .MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (контекст HttpContext, AsyncCallback cb, объект extraData) + 16
System.Web.Hall ExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +444 System.Web.HttpApplication.ExecuteStepImpl (шаг IExecutionStep) +132 System.Web.HttpApplication.ExecuteStep * * IExecutionShep, завершен, 16-й шаг 10, завершен

Редактировать: Добавление 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();
        }
    }
...