I want to create generic a query handler(and command handler in the future) which could handle each query and after processing, returns query result.
IQueryHandler interfaces:
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(which is marker interface):
public interface IQuery
{
}
Simple query object:
public class BrowseTitlesQuery : IQuery
{
public string Title { get; set; }
}
Simple query handler object:
public class BrowseTitlesQueryHandler : IQueryHandler<BrowseTitlesQuery, IEnumerable<string>>
{
public IEnumerable<string> Execute(BrowseTitlesQuery query)
{
throw new System.NotImplementedException();
}
}
QueryBus
public class QueryBus
{
public object Resolve<T>(IQuery query)
where T: IQueryHandler<IQuery, Object>, IQueryHandler, new()
{
return new T().Execute(query);
}
}
And of course Program.cs class(I'm using console application to test)
class Program
{
static void Main(string[] args)
{
var bus = new QueryBus();
var query = new BrowseTitlesQuery();
bus.Resolve<BrowseTitlesQueryHandler>(query);
}
}
In my opinion it should works but it doesn't. I have following error:
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]
Why is that?