Я пытаюсь, чтобы Autofac полностью работал в приложении MVC Core (для .Net 4.7.2).
Инжектор конструктора на контроллерах в порядке, но я сталкиваюсь с трудностями, чтобы он работал с классами, унаследованными от ValidationAttribute, DisplayNameAttribute и т. Д.: Autofac никогда не вызывается для создания экземпляров этих объектов .
Для его инициализации у меня есть несколько модулей Autofac (все они называются, как и ожидалось), а для аннотаций данных у меня есть, например, специально:
public class MyModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.RegisterType<LocalizedDisplayNameAttribute>()
.OnActivated(a => a.Instance.TranslationService = a.Context.Resolve<ITranslationService>());
}
}
}
LocalizedDisplayName - это класс, унаследованный от DisplayNameAttribute
, используемый непосредственно в свойствах модели, он имеет открытое свойство public ITranslationService TranslationService { get; set; }
, поэтому, если Autofac был вызван, как и ожидалось, свойство должно быть инициализировано с соответствующим экземпляром службы, но это не так.
У меня та же проблема с классами, унаследованными от ValidationAttribute
, используемыми для той же цели.
Запуск моего приложения выглядит следующим образом:
Запуск:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IContainer ApplicationContainer { get; private set; }
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(
CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = new PathString("/Account/logIn");
options.LogoutPath = new PathString("/Account/LogOut");
});
services.AddMvc();
return SetupAutofacSupport(services);
}
private IServiceProvider SetupAutofacSupport(IServiceCollection services)
{
services.AddAutofac();
// Create the container builder.
var builder = new ContainerBuilder();
builder.RegisterModule<MyModule>();
// ... And some other modules
builder.Populate(services);
var container = builder.Build();
ApplicationContainer = container;
return new AutofacServiceProvider(ApplicationContainer);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Account}/{action=LogIn}/{id?}");
});
}
}
Программа:
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog()
.UseStartup<Startup>()
.Build();
}
}
Как настроить приложение MVC Core, чтобы оно использовало Autofac для классов аннотаций моделей?
Спасибо за чтение