Я использую 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();
}
}