[英]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.