Autofa c DI миграция на ASP. NET Core DI - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть функция, которая разрешает службу с помощью autofa c IComponentContext Resolve

Startup.cs

 public void ConfigureContainer(ContainerBuilder builder)
    {
        builder.RegisterAssemblyTypes(Assembly.GetEntryAssembly())
          .AsImplementedInterfaces();
        builder.AddDispatchers();
    }

builder.AddDispatchers ():

 public static class Extensions
{
    public static void AddDispatchers(this ContainerBuilder builder)
    {
        builder.RegisterType<CommandDispatcher>().As<ICommandDispatcher>();
        builder.RegisterType<Dispatcher>().As<IDispatcher>();
        builder.RegisterType<QueryDispatcher>().As<IQueryDispatcher>();
    }
}

Динамически выбирается обработчик по типу

public class QueryDispatcher : IQueryDispatcher
{
    private readonly IComponentContext _context;

    public QueryDispatcher(IComponentContext context)
    {
        _context = context;
    }

    public async Task<TResult> QueryAsync<TResult>(IQuery<TResult> query)
    {
        var handlerType = typeof(IQueryHandler<,>)
            .MakeGenericType(query.GetType(), typeof(TResult));

        dynamic handler = _context.Resolve(handlerType);

        return await handler.HandleAsync((dynamic)query);
    }
}

Что мне нужно сделать, чтобы перенести его на встроенный ASP. NET Core DI?

1 Ответ

0 голосов
/ 25 февраля 2020

Регистрация:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ICommandDispatcher, CommandDispatcher>();
    services.AddScoped<IDispatcher, Dispatcher>();
    services.AddScoped<IQueryDispatcher, QueryDispatcher>();
}

Инъекция:

public class QueryDispatcher : IQueryDispatcher
{
    private readonly IServiceProvider _serviceProvider;

    public QueryDispatcher(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public async Task<TResult> QueryAsync<TResult>(IQuery<TResult> query)
    {
        var handlerType = typeof(IQueryHandler<,>)
            .MakeGenericType(query.GetType(), typeof(TResult));

        dynamic handler = _serviceProvider.GetService(handlerType);

        return await handler.HandleAsync((dynamic)query);
    }
}

Примечание. Я использую область действия, поскольку вы не указали желаемый срок службы, но вы также можете используйте AddSingleton или AddTransient.

...