我有一个QueryProcessor类的以下实现:
public TResult Process<TResult>(INewQuery<TResult> newQuery)
{
var handlerType = typeof(INewQueryHandler<,>).MakeGenericType(newQuery.GetType(), typeof(TResult));
IEnumerable<object> handlers = this.container.GetAllInstances(handlerType);
dynamic handler = handlers.ElementAt(0);
return handler.Handle((dynamic)newQuery);
}
INewQuery定义为:
public interface INewQuery<TResult>
{
}
INewQueryHandler定义为:
public interface INewQueryHandler<TNewQuery, TResult>
where TNewQuery : INewQuery<TResult>
{
TResult Handle(TNewQuery query);
}
我使用容器注册,如下所示:
this.container = new SimpleInjector.Container();
this.container.RegisterManyForOpenGeneric(
typeof(Cai.Apex.Library.Infrastructure.INewQueryHandler<,>),
container.RegisterAll,
assemblyLoader.GetAssemblies());
现在,如果我创建一个具体的查询,如:
public class GetDriver : INewQuery<Apdriver>
{
public string DriverId { get; set; }
}
然后创建一个实例:
GetDriver driver = new GetDriver {DriverId = "AXN"};
然后在queryProcessor上调用Process:
var result = this.queryProcessor.Process(driver);
一切正常,容器找到查询的处理程序,一切都很好。
现在换另一个场景,我只知道查询的名称,在本例中是GetDriver,通过服务调用,我得到了它的属性的值,&#34; AXN&#34;。 我需要在此方案中创建查询GetDriver的实例。所以在前面,所有INewQuery类型的注册都已完成,查询的名称及其类型存储在字典中。
foreach (var assembly in assemblyLoader.GetAssemblies())
{
var types = from type in assembly.GetTypes()
from i in type.GetInterfaces()
where i.IsGenericType &&
((i.GetGenericTypeDefinition() == typeof(INewQuery<>)))
select type;
foreach (var type in types)
{
this.newBusinessTypes.Add(type.Name, type);
}
}
稍后这个newBusinessTypes用于使用名称&#34; GetQuery&#34;来获取类型。进来了,它的实例创建如下:
var specificQuery = Activator.CreateInstance(matchedQuery);`(这里的matchquery是查询名称的匹配类型)。 匹配查询被定义为动态类型。
然后我调用queryprocessor进程方法:
var result = this.queryProcessor.Process(specificQuery);
Process方法中发生的事情是,handlerType被定义得很好,但该类型的container.getallinstances不会返回匹配的处理程序。因此,下一次调用获取第0个元素失败,因此无法调用Handle方法。
我不确定,这里出了什么问题以及为什么容器没有检索到处理程序。我很难过。
请指教,
谢谢,
阿米特