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 ответ:
Похоже, что вы используете сканирование сборок для загрузки зависимостей. Это известное поведение IIS, и оно объясняется в документации Autofac: Почему мои сборки не сканируются после перезапуска IIS?
При размещении приложений в IIS все сборки загружаются в
AppDomain
при первом запуске приложения, но когдаAppDomain
повторно используется IIS, сборки загружаются только по требованию.Чтобы избежать этой проблемы, используйте метод
GetReferencedAssemblies()
наSystem.Web.Compilation.BuildManager
, чтобы получить список ссылочных сборок вместо этого:var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
, что заставит упомянутые сборки быть загруженными в
AppDomain
немедленно делая их доступными для сканирования модуля.