Autofac не всегда разрешает мои зависимости


Когда я создаю свои проекты в среде профессиональной разработки Visual Studio 2013, иногда все мои репозитории в контроллерах имеют значение null, потому что autofac не разрешает их должным образом. Это происходит примерно в 30% случаев.

Вот код инициализации Autofac, который я использую:

public class AutofacConfig
{
    public static void ConfigureAutofac()
    {
        var assemblies = AppDomain.CurrentDomain.GetAssemblies();
        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly);
        builder.RegisterSource(new ViewRegistrationSource()); 
        builder.RegisterFilterProvider();

        builder.RegisterAssemblyTypes(assemblies)
               .Where(t => t.Name.EndsWith("Repository"))
               .AsImplementedInterfaces()
               .InstancePerRequest();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

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

1 2

1 ответ:

Похоже, что вы используете сканирование сборок для загрузки зависимостей. Это известное поведение IIS, и оно объясняется в документации Autofac: Почему мои сборки не сканируются после перезапуска IIS?

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

Чтобы избежать этой проблемы, используйте метод GetReferencedAssemblies() на System.Web.Compilation.BuildManager, чтобы получить список ссылочных сборок вместо этого:

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

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