0

特定のコントラクトと実装のためにデコレータを登録する方法について、フィードバックを得たいと思っていました。これが私が持っているものです

このようなマーカー クエリ インターフェイス

public interface IQueryBase
{

}

このようなクエリ ハンドラ コントラクト

   public interface IQueryHandlerNew<TQuery, TResult>
  where TQuery : IQueryBase
{
    TResult Handle(TQuery request);
    Task<TResult> HandleAsync(TQuery request);
}

このような実際のクエリ

public sealed class FindCitiesByCountryIdQuery : IQueryBase
{
    public int PageNumber { get; set; }
    public int CountryId { get; set; }
    public int PageSize { get; set; }
}


public class CityReadModel
{
    public int CityId { get; set; }
    public string CityName { get; set; }
}

そして最後に、そのようなクエリハンドラ

   public class FindCitiesByCountryIdQueryHandler : IQueryHandlerNew<FindCitiesByCountryIdQuery, CityReadModel[]>
{
    public CityReadModel[] Handle(FindCitiesByCountryIdQuery request)
    {
        throw new NotImplementedException();
    }

    public Task<CityReadModel[]> HandleAsync(FindCitiesByCountryIdQuery request)
    {
        throw new NotImplementedException();
    }
}

これがクエリハンドラのロギングデコレータです

 public class QueryHandlerLogginDecorator2<TQuery, TResult> : IQueryHandlerNew<TQuery, TResult> where TQuery : IQueryBase
{
    private readonly IQueryHandlerNew<TQuery, TResult> _decoratee;
    private readonly ICustomLogger _logger;

    public QueryHandlerLogginDecorator2(IQueryHandlerNew<TQuery, TResult> decoratee, ICustomLogger logger)
    {
        _decoratee = decoratee;
        _logger = logger;
    }

    public TResult Handle(TQuery request)
    {
        try
        {
            //Log request information here 
            return _decoratee.Handle(request);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, string.Format(LogConstants.ErrorLogFormat, DateTime.UtcNow, GetType(), ex.Message));
            throw;
        }
    }

    public Task<TResult> HandleAsync(TQuery request)
    {
        try
        {
            //Log request information here 
            return _decoratee.HandleAsync(request);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, string.Format(LogConstants.ErrorLogFormat, DateTime.UtcNow, GetType(), ex.Message));
            throw;
        }
    }
}

このような simpleinjector register デコレーターを使用してこのセットアップを登録しようとすると

container.RegisterDecorator(typeof(IQueryHandlerNew<>), typeof(QueryHandlerLogginDecorator2<>), Lifestyle.Transient);

失敗し、「IQueryHandlerNew を使用するには 2 つの型引数が必要です」と表示されます

同様のセットアップを使用して、1 つの型引数 (たとえば、リポジトリ用) でデコレータを登録すると、問題なく登録されます。

ここで何が間違っているのかわかりません。simpleinjector と複数の型引数を持つデコレータの登録に関する既知の制限はありますか?

4

0 に答える 0