簡體   English   中英

Autofac DI 遷移到 ASP.NET Core DI

[英]Autofac DI migration to ASP.NET Core DI

我有使用 autofac IComponentContext Resolve 解析服務的功能

啟動文件

 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>();
    }
}

它是通過它的類型動態選擇 Handler

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?

登記:

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);
    }
}

注意:我使用生命周期范圍是因為您沒有提供有關所需生命周期的任何指示,但您也可以使用AddSingletonAddTransient

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM