打开泛型的简单注入器回退注册不起作用

本文关键字:回退 注册 不起作用 注入器 简单 泛型 | 更新日期: 2023-09-27 18:13:22

我有以下内容

class GetData : Query
class Data : Result
class IHandler<TIn,TOut>
class IQueryHandler<TQuery,TResult> : IHandler<TQuery, IEnumerable<TResult>>
class DefaultQueryHandler<TQuery,TResult> : IQueryHander<TQuery,TResult>
Container.RegisterConditional(
    typeof(IHandler<,>),
    typeof(DefaultQueryHandler<,>),
    c => c!.Handled
)

我遵循这里的指南https://simpleinjector.readthedocs.io/en/latest/advanced.html#registration-of-open-generic-types并认为

Container.GetInstance<IHandler<GetData,IEnumerable<Data>>>应该实例化DefaultQueryHandler<GetData, Data>

但是我得到'No registration found for IHandler'

Thank you

打开泛型的简单注入器回退注册不起作用

我试图重现您的错误,但是当我在控制台应用程序中运行它时,一切都如预期的那样工作。下面是我用来复制的代码:

using System;
using System.Collections.Generic;
using SimpleInjector;
class Query { }
class Result { }
class GetData : Query { }
class Data : Result { }
class IHandler<TIn, TOut> { }
class IQueryHandler<TQuery, TResult> : IHandler<TQuery, IEnumerable<TResult>> { }
class DefaultQueryHandler<TQuery, TResult> : IQueryHandler<TQuery, TResult> { }
class Program
{
    static void Main(string[] args)
    {
        var container = new Container();
        container.RegisterConditional(
            typeof(IHandler<,>),
            typeof(DefaultQueryHandler<,>),
            c => !c.Handled);
        var handler = container.GetInstance<IHandler<GetData, IEnumerable<Data>>>();
        Console.WriteLine(handler.GetType().FullName);
        Console.ReadLine();
    }
}

GetInstance调用返回以下封闭类型:

DefaultQueryHandler<GetData, Data>