我有以下代码:
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
有人可以帮助我吗?
谢谢你, 米格尔
答案 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的博客文章详细介绍了结构图开放式泛型,其中包括一个涵盖扫描的示例。