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);

Повече информация за wiki страница на 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(), ще трябва да добавите израз за използване за 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