C# StructureMap-寄存器泛型类型
我有以下代码:C# StructureMap-寄存器泛型类型,c#,generics,types,structuremap,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); } } 公共类调度程序:IDispatcher{ 公共无效发送(订单)
public class Dispatcher : IDispatcher {
public void Send(Order order) {
var type = typeof(IOrderHandler<>).MakeGenericType(order.GetType());
var handler = ObjectFactory.GetInstance(type);
}
}
公共类调度程序:IDispatcher{
公共无效发送(订单){
var type=typeof(IOrderHandler).MakeGenericType(order.GetType());
var handler=ObjectFactory.GetInstance(类型);
}
}
注意:我正在尝试获取IOrderHandler,在这种情况下,顺序是:
公共类余序:序{}
我的StructureMap配置如下:
ObjectFactory.Initialize(x => {
x.For<IOrderHandler>().Use<OrderHandler>();
});
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
ObjectFactory.Initialize(x=>{
x、 For().Use();
});
当我调试它时,会出现以下错误:
{“StructureMap配置失败:\r\n错误:104\r\n源:注册表:StructureMap.configuration.DSL.Registry,StructureMap,版本=2.6.4.0
我尝试了其他选项,但最终总是出现104错误或202错误:
“StructureMap异常代码:202\n没有为PluginFamily项目Test.Tests+IOrderHandler`1[[Proj.Test.Tests+CoffeOrder,Proj.Test,…]定义默认实例
注意:CoffeOrder是我通过测试的订单类型
我的处理程序类和接口代码如下:
ObjectFactory.Initialize(x => {
x.For<IOrderHandler>().Use<OrderHandler>();
});
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
公共类CoffeHandler:OrderHandler{
公共覆盖无效句柄(CoffeOrder){
//一些代码
}//CoffeHandler
}
公共接口IOrderHandler{
无效处理(订单);
}//IOrderHandler
公共接口IOrderHandler:IOrderHandler,其中TOrder:Order{
无效句柄(TOrder命令);
}//IOrderHandler
公共抽象类OrderHandler:IOrderHandler{
公开摘要无效处理(命令);
}//OrderHandler
公共抽象类OrderHandler:OrderHandler,IOrderHandler其中TOrder:Order{
公共覆盖无效句柄(订单){
TOrder TOrder=(TOrder)顺序;
手柄(扭柄);
}//手柄
公开摘要无效处理(托德命令);
}//OrderHandler
谁能帮我一下吗
谢谢,,
Miguel请注意,您的注册失败,而不是解决问题。您的注册说明:“当请求类型为
IOrderHandler
的类时,请返回OrderHandler
的具体实例
您的OrderHandler
是一个抽象类,因此StructureMap无法创建它的具体实例。如果您按照以下方式注册
ObjectFactory.Initialize(
x => x.For<IOrderHandler<CoffeOrder>>().Use<CoffeHandler>());
如果你有一个IOrderHandler
的具体的泛型实现,你可以注册它。但是因为你没有,而且[根据我的直觉]你不想注册每一个具体的实例,你需要做一次扫描。如何做到这一点是一个完全不同的问题,在不知道你想扫描什么的情况下,我无法回答。但是你可以在一篇博客文章中看到详细的结构图开放泛型,其中包括一个覆盖扫描的示例