I dont know how map interface with two implementations, can help.
public interface IQuery
{
}
public interface IQueryResult
{
}
public interface IQueryHandler<in TParameter, out TResult> where TResult : IQueryResult where TParameter : IQuery
{
TResult Retrieve(TParameter query);
}
public interface IQueryDispatcher
{
TResult Dispatch<TParameter, TResult>(TParameter query)
where TParameter : IQuery
where TResult : IQueryResult;
}
public class QueryDispatcher : IQueryDispatcher
{
private readonly IUnityContainer _container;
public QueryDispatcher(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
_container = container;
}
public TResult Dispatch<TParameter, TResult>(TParameter query)
where TParameter : IQuery
where TResult : IQueryResult
{
var handler = _container.Resolve<IQueryHandler<TParameter, TResult>>();
return handler.Retrieve(query);
}
}
static void Main(string[] args)
{
using (var container = new UnityContainer())
{
container.RegisterType<IQueryDispatcher, QueryDispatcher>(new HierarchicalLifetimeManager());
container.RegisterTypes(AllClasses.FromAssemblies(typeof(IQueryHandler<,>).Assembly), WithMappings.FromAllInterfaces, WithName.TypeName, WithLifetime.Hierarchical);
var _queryDispatcher = container.Resolve<IQueryDispatcher>();
TasksByStatusQuery query = new TasksByStatusQuery { IsCompleted = true };
var result = _queryDispatcher.Dispatch<TasksByStatusQuery, TasksByStatusQueryResult>(query);
}
}
Exception:
Resolution of the dependency failed, type = "CQRSUnity.Cqrs.IQueryHandler`2[CQRSUnity.Query.TasksByStatusQuery,CQRSUnity.QueryResult.TasksByStatusQueryResult]", name = "(none)".
Update:
I can try register each:
container.RegisterType(typeof(IQueryHandler<,>), typeof(TasksByStatusQueryHandler), new HierarchicalLifetimeManager());
container.RegisterType(typeof(IQueryHandler<,>), typeof(TasksByDateQueryHandler), new HierarchicalLifetimeManager());
Exception:
Unable to cast object of type 'CQRSUnity.QueryHandler.TasksByDateQueryHandler' to type 'CQRSUnity.Cqrs.IQueryHandler`2[CQRSUnity.Query.TasksByStatusQuery,CQRSUnity.QueryResult.TasksByStatusQueryResult]'.