各クエリーを処理し、処理後にクエリー結果を返すジェネリッククエリーハンドラ(および今後のコマンドハンドラ)を作成したいと思います。汎用クエリーハンドラcqrs
IQueryHandlerインターフェース:(マーカーインターフェイスである)
public interface IQueryHandler
{
}
public interface IQueryHandler<TResult> : IQueryHandler
{
TResult Execute();
}
public interface IQueryHandler<TQuery, TResult> : IQueryHandler
where TResult : class
where TQuery: class
{
TResult Execute(TQuery query);
}
IQUERYのintefaceを:
public interface IQuery
{
}
単純なクエリオブジェクト:
public class BrowseTitlesQuery : IQuery
{
public string Title { get; set; }
}
単純なクエリハンドラオブジェクト:
私の意見では3210QueryBus
public class QueryBus
{
public object Resolve<T>(IQuery query)
where T: IQueryHandler<IQuery, Object>, IQueryHandler, new()
{
return new T().Execute(query);
}
}
そしてもちろんのProgram.csのクラス(私はテストへのコンソールアプリケーションを使用しています)
class Program
{
static void Main(string[] args)
{
var bus = new QueryBus();
var query = new BrowseTitlesQuery();
bus.Resolve<BrowseTitlesQueryHandler>(query);
}
}
それは作品のはずですが、それはしていません。 次のエラーがあります:
The type 'cqrs.BrowseTitlesQueryHandler' cannot be used as type parameter 'T' in the generic type or method 'QueryBus.Resolve(IQuery)'. There is no implicit reference conversion from 'cqrs.BrowseTitlesQueryHandler' to 'cqrs.IQueryHandler'. [cqrs]
なぜですか?
理由あなたは "IQueryHandler"という名前の3つのインターフェースを持っていますか? –
テストのためだけに、私は最終的に上記のリストの3番目になる単一のインターフェイスを持ちたいと思っています。 – bielu000
あなたがリファクタリングして3番目だけを残したら? –