繁体   English   中英

StructureMap - 注册通用类型

[英]StructureMap - Register Generic Type

我有以下代码:

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配置失败:\\ 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

有人可以帮助我吗?

谢谢你,米格尔

请注意,您在注册时立即失败,而不是在解决方案。 您的注册说:“当请求类型为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<>的具体通用实现,你可以注册它。 但是既然你没有[按照我的预感]你不想记录每个具体的实例,你将需要进行扫描。 如何做到这一点真的是一个不同的问题,我不知道你想要扫描什么,我无法回答。 但是你可以在这里看到一篇博文,详细介绍了结构图开放式仿制药,其中包括一个涵盖扫描的样本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM