Autofac Загуба на регистрации в Web.Config Edit

Имам многослойно уеб приложение, което създадох с ASP.NET MVC 4, WebAPI и някои други компоненти. Използвам най-новата версия на Autofac 2.6.2.859 като мой DI контейнер заедно с интеграциите на MVC и WebAPI. Имам настройка на модули autofac в моите различни слоеве и използвам новите RegisterAssemblyModules, за да сканирам модулите на AppDomain за различните модули.

При стартиране всеки работи чудесно. Когато редактирам файла web.config и приложението загрее, моите регистрации се губят. Получавам DependencyResolutionException -

Нито един от намерените конструктори с „Флагове за публично обвързване“ на тип „My.Class.Name“ не може да бъде извикан с наличните услуги и параметри:

Така че моите регистрации не се презареждат. Някой знае ли как да се справи с този проблем? Трябва ли да поставя кода си за инициализация някъде другаде освен Application_Start()?

АКТУАЛИЗАЦИЯ

Ето как изглежда моят код

 public static class IoC
{
    public static void Configure()
    {
        var builder = new ContainerBuilder();
        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        //Assembly Modules            
        builder.RegisterAssemblyModules<NSUTriviaModuleBase>(assemblies);

        // Register API controllers using assembly scanning.
        builder.RegisterControllers(assemblies);

        // Register API controllers using assembly scanning.
        builder.RegisterApiControllers(assemblies);

        var container = builder.Build();
        // Set the dependency resolver implementation.
        var resolver = new AutofacWebApiDependencyResolver(container);

        GlobalConfiguration.Configuration.DependencyResolver = resolver;
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

person cecilphillip    schedule 15.06.2012    source източник
comment
Интересно - изпълнявате ли това по време на отстраняване на грешки, напр. в Cassini или IIS Express, или това е нещо, което правите в прод. :)   -  person Nicholas Blumhardt    schedule 15.06.2012
comment
Работи в режим на отстраняване на грешки на отдалечен промеждувен сървър с IIS 6 и .NET 4.0. Работи добре на IIS 7.5 Express локално. Грешки възникват само когато има рециклиране.   -  person cecilphillip    schedule 15.06.2012
comment
Можете ли да зададете някакво проследяване/регистриране, за да изследвате състоянията на DependencyResolvers, когато възникне грешката? И двете все още ли са тези на Autofac?   -  person Jim Bolla    schedule 16.06.2012
comment
Опитахме решението от Alex Meyer-Gleaves, но все още не работи. Ние използваме IIS Express/VS2012. Поне можем да го възпроизведем надеждно с редакция на web.config!   -  person SturmUndDrang    schedule 30.05.2013


Отговори (1)


Мисля, че проблемът е, че всички модули се зареждат в AppDomain, когато приложението се стартира за първи път, но когато AppDomain се рециклира от IIS, модулите се зареждат само при поискване.

Опитайте да използвате метода GetReferencedAssemblies на System.Web.Compilation.BuildManager, за да получите вместо това списък с референтните сборки.

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

Това трябва да принуди посочените модули да бъдат заредени в AppDomain незабавно, което ги прави достъпни за сканиране на модули.

person Alex Meyer-Gleaves    schedule 20.06.2012