使用SimpleInjector的GetAllInstances

时间:2014-08-22 15:09:54

标签: c#

我有一个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方法。

我不确定,这里出了什么问题以及为什么容器没有检索到处理程序。我很难过。

请指教,

谢谢,

阿米特

0 个答案:

没有答案