代码之家  ›  专栏  ›  技术社区  ›  r3plica

c#asp.net核心寄存器嵌套泛型类

  •  0
  • r3plica  · 技术社区  · 5 年前

    我有一节课是这样的:

    public class GenericList<T> : IRequest<Attempt<IQueryable<T>>>
    {
    }
    
    public class GenericListHandler<T> : IRequestHandler<GenericList<T>, Attempt<IQueryable<T>>> where T: class
    {
        private readonly DatabaseContext _databaseContext;
        public GenericListHandler(DatabaseContext databaseContext) => _databaseContext = databaseContext;
    
        public async Task<Attempt<IQueryable<T>>> Handle(GenericList<T> request, CancellationToken cancellationToken) =>
            Attempt<IQueryable<T>>.Succeed(_databaseContext.Set<T>());
    }
    

    我想把它登记在我的 启动 班级。

    services.AddTransient(typeof(GenericListHandler<>), typeof(GenericListHandler<>));
    

    但这并不能解决问题。我相信是因为它需要下决心 IRequestHandler<GenericList<T>, Attempt<IQueryable<T>>>

    services.AddTransient(serviceType: typeof(IRequestHandler<GenericList<>, Attempt<IQueryable<>>>),typeof(GenericListHandler<>));
    

    但它不喜欢。我得到这个错误:

    意外使用了未绑定的泛型名称

    我也尝试过:

    services.AddTransient(serviceType: typeof(IRequestHandler<,>),typeof(GenericListHandler<>));
    

    有人能帮我吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   r3plica    5 年前

    显然,您不能注册嵌套泛型:

    Cannot register nested generic interface in .NET Core

    private static void AddGenericList(IServiceCollection services)
    {
        services
            .AddTransient<IRequestHandler<GenericList<Attribute>, Attempt<IQueryable<Attribute>>>,
                GenericListHandler<Attribute>>();
        services
            .AddTransient<IRequestHandler<GenericList<Brand>, Attempt<IQueryable<Brand>>>,
                GenericListHandler<Brand>>();
        services
            .AddTransient<IRequestHandler<GenericList<Category>, Attempt<IQueryable<Category>>>,
                GenericListHandler<Category>>();
        services
            .AddTransient<IRequestHandler<GenericList<Conversion>, Attempt<IQueryable<Conversion>>>,
                GenericListHandler<Conversion>>();
        services
            .AddTransient<IRequestHandler<GenericList<Criterion>, Attempt<IQueryable<Criterion>>>,
                GenericListHandler<Criterion>>();
        services
            .AddTransient<IRequestHandler<GenericList<Exclusion>, Attempt<IQueryable<Exclusion>>>,
                GenericListHandler<Exclusion>>();
        services
            .AddTransient<IRequestHandler<GenericList<Feed>, Attempt<IQueryable<Feed>>>,
                GenericListHandler<Feed>>();
        services
            .AddTransient<IRequestHandler<GenericList<FieldMap>, Attempt<IQueryable<FieldMap>>>,
                GenericListHandler<FieldMap>>();
        services
            .AddTransient<IRequestHandler<GenericList<Field>, Attempt<IQueryable<Field>>>,
                GenericListHandler<Field>>();
        services
            .AddTransient<IRequestHandler<GenericList<Filter>, Attempt<IQueryable<Filter>>>,
                GenericListHandler<Filter>>();
        services
            .AddTransient<IRequestHandler<GenericList<Floor>, Attempt<IQueryable<Floor>>>,
                GenericListHandler<Floor>>();
        services
            .AddTransient<IRequestHandler<GenericList<Formula>, Attempt<IQueryable<Formula>>>,
                GenericListHandler<Formula>>();
        services
            .AddTransient<IRequestHandler<GenericList<Plan>, Attempt<IQueryable<Plan>>>,
                GenericListHandler<Plan>>();
        services
            .AddTransient<IRequestHandler<GenericList<Rule>, Attempt<IQueryable<Rule>>>,
                GenericListHandler<Rule>>();
        services
            .AddTransient<IRequestHandler<GenericList<Theatre>, Attempt<IQueryable<Theatre>>>,
                GenericListHandler<Theatre>>();
        services
            .AddTransient<IRequestHandler<GenericList<Transformation>, Attempt<IQueryable<Transformation>>>,
                GenericListHandler<Transformation>>();
        services
            .AddTransient<IRequestHandler<GenericList<Venue>, Attempt<IQueryable<Venue>>>,
                GenericListHandler<Venue>>();
    }
    

    这不是最理想的解决方案,但确实有效。

    推荐文章