Заставьте Autofac работать в приложении MVC Core с аннотациями и валидаторами данных модели. - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь, чтобы 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 для классов аннотаций моделей?

Спасибо за чтение

...