1

我有以下代码:

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

注意:我正在尝试获取 IOrderHandler,在这种情况下,订单为: public class CoffeOrder : Order { }

我的 StructureMap 配置如下:

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

调试时出现以下错误: {"StructureMap configuration failures:\r\nError: 104\r\nSource: Registry: StructureMap.Configuration.DSL.Registry, StructureMap, Version=2.6.4.0, ...

我尝试了其他选项,但总是以 104 错误或 202 错误结束:“StructureMap 异常代码:202\nNo Default Instance defined for PluginFamily Proj.Test.Tests+IOrderHandler`1[[Proj.Test.Tests+CoffeOrder,项目测试,...

注意: 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

有人可以帮我吗?

谢谢你,米格尔

4

1 回答 1

3

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

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

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

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

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

然后您的分辨率代码将如下所示:

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

如果你有一个具体的通用实现,IOrderHandler<>你可以注册它。但是由于您不这样做并且 [根据我的直觉] 您不想注册每个具体实例,因此您需要进行扫描。如何做到这一点确实是一个不同的问题,如果不知道您要扫描什么,我无法回答。但是您可以在此处查看详细介绍 Structure Map 开放泛型的博客文章,其中包括涵盖扫描的示例。

于 2012-09-14T02:07:07.877 回答