Когато създавам моите проекти в моето Visual Studio 2013Професионална среда за разработка, има моменти, когато моите хранилища в контролерите ми са нищожни, защото Autofac не ги разрешава правилно. Това се случва около 30% от времето.
Ето кода на Initialization на 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));
}
}
През по-голямата част от времето, когато REBUILD проекта или излизане и се върна, проблемът е фиксиран.
Отговори:
4 за отговор № 1Изглежда, че използвате сканиране на монтаж, за да заредите зависимостите си. Това е известно поведение на IIS и е обяснено в документацията на Autofac: Защо моите събрания не се сканират след рестартирането на IIS?
При хостване на приложения в IIS всички модули се зареждат в
AppDomain
при първото стартиране на приложението, но когатоAppDomain
се рециклират от IIS, след това агрегатите се зареждат само при поискване.За да избегнете този проблем използвайте
GetReferencedAssemblies()
метод наSystem.Web.Compilation.BuildManager
за да получите списък на референтните събрания вместо това:var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
Това ще принуди посочените групи да бъдат заредени в
AppDomain
като ги направиха достъпни за сканиране на модули.