Внедрение свойства Autofac в проект .NET Core MVC - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть контроллер со свойством типа ILol и классом Lol, реализующим ILol.

public class UniversityController : Controller
{
    public ILol Lol { get; set; }

    public IActionResult Index()
    {
        ViewData["Header"] = "Hello, world!";
        ViewData["NullCheck"] = Lol == null ? "It's null" : Lol.GetLol();

        return View();
    }
}

Я пытаюсь использовать Внедрение свойства с Autofac таким образом (часть моего Startup класса):

public IContainer ApplicationContainer { get; private set; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        // Dependency resolving.
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        ContainerBuilder builder = new ContainerBuilder();

        builder.RegisterType<Lol>().As<ILol>().PropertiesAutowired().InstancePerLifetimeScope();
        builder.Populate(services);

        IContainer container = builder.Build();

        ApplicationContainer = container;

        return new AutofacServiceProvider(container);
    }

Это не работает.Свойство является нулевым во время выполнения.Хотя конструктор инъекций работает правильно.

1 Ответ

0 голосов
/ 31 декабря 2018

Необходимо указать, в каких контроллерах необходимо использовать свойства Injection:

 var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
            .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
 builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();

И вызвать AddControllersAsServices ():

services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_2) .AddControllersAsServices();

Если вам нужнозарегистрировать внедрение свойств, просто зарегистрировать другие типы PropertiesAutowired () в компоновщике.

И ConfigureServices будет выглядеть следующим образом:

public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        // Dependency resolving.
        services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        .AddControllersAsServices();

        ContainerBuilder builder = new ContainerBuilder();
        builder.Populate(services);//Autofac.Extensions.DependencyInjection

        builder.RegisterType<Lol>().As<ILol>().PropertiesAutowired().InstancePerLifetimeScope();
        builder.Populate(services);

        var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
            .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
        builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();

        IContainer container = builder.Build();

        ApplicationContainer = container;

        return new AutofacServiceProvider(container);
    }
...