StructureMap - 注册通用类型

时间:2012-09-13 22:25:28

标签: c# generics types structuremap

我有以下代码:

public class Dispatcher : IDispatcher {
  public void Send(Order order) {
    var type = typeof(IOrderHandler<>).MakeGenericType(order.GetType());
    var handler = ObjectFactory.GetInstance(type);
  }
}

注意:我正在尝试获取IOrderHandler,在这种情况下的顺序是:     公共类CoffeOrder:订单{}

我的StructureMap配置如下:

ObjectFactory.Initialize(x => {
  x.For<IOrderHandler>().Use<OrderHandler>();
});

当我调试它时,我收到以下错误: {“StructureMap配置失败:\ r \ n错误:104 \ r \ nSource:注册表:StructureMap.Configuration.DSL.Registry,StructureMap,Version = 2.6.4.0,...

我尝试了其他选项但最终总是出现104错误或202错误: “StructureMap异常代码:202 \ n没有为PluginFamily Proj.Test.Tests定义的默认实例+ IOrderHandler`1 [[Proj.Test.Tests + CoffeOrder,Proj.Test,...

注意:CoffeOrder是我在测试中传递的订单的类型。

我的Handler类和接口代码如下:

public class CoffeHandler : OrderHandler<CoffeOrder> {
  public override void Handle(CoffeOrder order) {
    // Some Code
  } // CoffeHandler
} 

public interface IOrderHandler {
  void Handle(Order order);
} // IOrderHandler

public interface IOrderHandler<TOrder> : IOrderHandler where TOrder : Order {
  void Handle(TOrder order);
} // IOrderHandler

public abstract class OrderHandler : IOrderHandler {
  public abstract void Handle(Order order);
} // OrderHandler

public abstract class OrderHandler<TOrder> : OrderHandler, IOrderHandler<TOrder> where TOrder : Order {

  public override void Handle(Order order) {
    TOrder torder = (TOrder)order;
    Handle(torder);
  } // Handle

  public abstract void Handle(TOrder order);

} // OrderHandler

有人可以帮助我吗?

谢谢你, 米格尔

1 个答案:

答案 0 :(得分:3)

请注意,您在注册时立即失败,而不是在解决方案。您的注册说:“当请求类IOrderHandler的类时,返回OrderHandler的具体实例

您的OrderHandler是一个抽象类,因此StructureMap无法创建它的具体实例。如果您注册如下,

ObjectFactory.Initialize(
            x => x.For<IOrderHandler<CoffeOrder>>().Use<CoffeHandler>());

你说,“当一个类IOrderHandler<CoffeOrder>被请求时(这是你在你的例子中请求的那个),返回CoffeHandler的具体实例。这是一个有效的映射,因为它可以实例化CoffeHandler

虽然上面解决了你的问题,但是如果你想要注册许多不同的实现,我可能希望StructureMap为你做更多的工作。如果是这种情况,那么你很幸运,因为StructureMap支持Open Generics。

然后您的解析代码将如下:

var handler = ObjectFactory.ForGenericType(typeof(IOrderHandler<>))
             .WithParameters(order.GetType())
             .GetInstanceAs<IOrderHandler>();

如果你有一个IOrderHandler<>的具体通用实现,你可以注册它。但是既然你没有[按照我的预感]你不想记录每个具体的实例,你将需要进行扫描。如何做到这一点真的是一个不同的问题,我不知道你想要扫描什么,我无法回答。但是你可以看到here的博客文章详细介绍了结构图开放式泛型,其中包括一个涵盖扫描的示例。