DependencyResolver.SetResolver Не работает

Я пытаюсь установить контейнер в новом приложении, используя метод Dependency.SetResolver и используя autofac с интеграцией autofac mvc 5.

Проблема в том, что настройка распознавателя, похоже, ничего не делает. Преобразователь по умолчанию будет использоваться всегда и всегда будет ожидать конструктор по умолчанию.

Любые идеи?

Изменить - global.asax.cs, я упростил его до:

var b = new ContainerBuilder();  
b.RegisterType<UserInfo>().As<IUserSession>().InstancePerHttpRequest();  
var container = b.Build();  
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

И HomeController принимает IUserSession в своем конструкторе. Возникшее исключение: "No parameterless constructor defined for this object." Thrown from "System.Web.Mvc.DefaultControllerActivator.Create"


person flukus    schedule 12.11.2013    source источник
comment
Пожалуйста, разместите свой код там, где вы звоните Dependency.SetResolver! Также ваша конфигурация контейнера, конструктор вашего контроллера и сообщение об исключении!   -  person nemesv    schedule 12.11.2013
comment
Вызывает ли вызов SetResolver исключение или это когда контроллер разрешается? Если вы отлаживаете программу и выясняете, что такое DependencyResolver.Current, это преобразователь по умолчанию или AutofacDependencyResolver? (У меня такое чувство, что заголовок вопроса неверен - я думаю, что разрешение не работает, а не вызов SetResolver.)   -  person Travis Illig    schedule 13.11.2013


Ответы (1)


Вы забыли зарегистрировать свои контроллеры:

b.RegisterControllers(typeof(MvcApplication).Assembly);

Дополнительная информация на вики-странице Autofac

person Alexandr Nikitin    schedule 12.11.2013
comment
В исходной версии это было, но это было this.GetType().Assembly. Проблема в том, что global.asax компилируется в другую сборку. - person flukus; 13.11.2013
comment
@flukus Тогда лучше использовать класс контроллера, например: b.RegisterControllers(typeof(MyController).Assembly); - person Alexandr Nikitin; 13.11.2013
comment
Чтобы использовать RegisterControllers(), вам нужно будет добавить оператор using для Autofac.Integration.Mvc; - person code-assassin; 14.09.2014
comment
Где еще нам нужно вносить записи или делать регистрацию для работы Autofac. Поскольку я реализовал код именно так, как он указан в документации Autofac. Вот мой IocConfig файл: IocConfig - person phougatv; 24.11.2016
comment
@barnes Вам нужно включить все сборки, в которых вы храните свои контроллеры. - person Alexandr Nikitin; 24.11.2016
comment
Спасибо, но не могли бы вы поподробнее. Я не совсем понимаю ваш ответ. О каких сборках вы говорите конкретно? Согласно Autofac-Docs, говорится о необходимости включения MvcApplication класс, который находится в Global.asax. Что еще я должен сюда включить? - person phougatv; 25.11.2016
comment
@barnes Autofac имеет метод ContainerBuilder.RegisterControllers(), который принимает Assembly в качестве входного параметра. Затем Autofac сканирует предоставленную вами сборку для Controller классов с помощью отражения и автоматически регистрирует их для вас. Так что, если вы храните контроллер в отдельных сборках, вам нужно указать их все. - person Alexandr Nikitin; 25.11.2016
comment
Я только что начал пример проекта для реализации Autofac. Там всего 2 контроллера и больше ничего. Я не уверен, что происходит не так, но я буду продолжать искать. Спасибо за вашу помощь и время. :) - person phougatv; 25.11.2016
comment
Мои проекты web.config содержат привязку сборки времени выполнения только для Microsoft.Owin. В то время как другой проект, работающий с использованием autofac, содержит привязки для Web.Grease, Autofac, Newtonsoft.Json и т. д. Нужно ли добавлять эти привязки сборки во время выполнения вручную или они генерируются автоматически? - person phougatv; 26.11.2016