特定のコントラクトと実装のためにデコレータを登録する方法について、フィードバックを得たいと思っていました。これが私が持っているものです
このようなマーカー クエリ インターフェイス
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 と複数の型引数を持つデコレータの登録に関する既知の制限はありますか?