Замок Виндзор - Зависимости от классов, созданных за пределами замка - PullRequest
0 голосов
/ 05 июня 2018

Замок Виндзор управляет моими зависимостями от классов B, C, D и т. Д.Они очень сложные, поэтому хорошо, что у меня есть Виндзор, который позаботится о них для меня.B, C, D, ect имеют зависимость от A, которая, поскольку .net-core не имеет WebRequestLifestyle, должна создаваться вне замка Виндзор.

Есть лиспособ предоставить объект класса A в замок Виндзор во время разрешения?

1 Ответ

0 голосов
/ 06 июня 2018

В ASP.NET Core WebRequestLifestyle называется Scoped.Вы можете получить его путем «перекрестного подключения» зависимости.Я не уверен, что в Castle уже встроена перекрестная проводка, но в противном случае вы можете добиться этого следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    // IHttpContextAccessor is required by the GetRequestService method.
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Usual stuff here
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Cross-wire ASP.NET Core service that needs to be injected
    container.Register(Component.For<A>()
        .UsingFactoryMethod(_ => app.GetRequiredRequestService<A>()));

    // Usual stuff here
}

В этом примере GetRequestService - это пользовательский метод расширения для IApplicationBuilderи определяется следующим образом:

public static T GetRequiredRequestService<T>(this IApplicationBuilder builder)
    where T : class
{
    var accessor = builder.ApplicationServices.GetService<IHttpContextAccessor>();
    var context = accessor.HttpContext ?? throw new InvalidOperationException(
        "No HttpContext.");
    return context.RequestServices.GetRequiredService<T>();
}
...