顺序实现一个调用使用统一依赖注入
本文关键字:调用 依赖 注入 一个 实现 顺序 | 更新日期: 2023-09-27 18:05:45
使用unity依赖注入在异步模式下实现顺序实现的最佳方法是什么?如果我调用一个方法来创建顺序,它应该在两个不同的实现中创建它。
我的控制器:
public class OrderController : BaseController
{
private IOrderRepository orderService;
public OrderController (IOrderRepository service)
{
this.orderService = service;
}
public ActionResult Create (OrderOL obj)
{
// here I want this to do two implementations
// first on OrderRepositorySQL
// and then after success response,
// it should implement in OrderRepositoryMongo as async method
orderService.Create(obj)
return view();
}
}
我接口:public interface IOrderRepository {
int Create (OrderOL obj);
}
我的实现类1
public class OrderRepositorySQL : IOrderRepository
{
public int Create (OrderOL obj)
{
// logic to Create order in Data store 1
}
}
我的实现类2
public class OrderRepositoryMongo : IOrderRepository
{
public int Create (OrderOL obj)
{
// logic to Create order in Data store 2
}
}
全球。asax AppStart事件使用ASP。. NET MVC Unity
container.RegisterType<IOrderRepository, OrderRepositorySQL>();
container.RegisterType<IOrderRepository, OrderRepositoryMongo>();
应用程序细节
- c#。净4.5
- ASP。Net MVC 5
- 统一3.0
你不能那样做,你一次只能解析一个组件。实际上,当您尝试解决IOrderRepository
时,这两行代码将在编译时或运行时发生冲突…
container.RegisterType<IOrderRepository, OrderRepositorySQL>();
container.RegisterType<IOrderRepository, OrderRepositoryMongo>();
基本上,您需要使用命名类型注册或向控制器注入包装器服务,该服务将解析这两个组件(OrderRepositorySQL和OrderRepositoryMongo)并执行所需的处理。
例子假设您有一个OrderProcessor
类来处理订单并实现IOrderProcessor
接口,对吗?
public interface IOrderProcessor
{
ProcessResult Process(OrderOL obj);
}
public class OrderProcessor : IOrderProcessor
{
public ProcessResult Process(OrderOL obj)
{
//TODO:
// 1- resolve OrderRepositorySQL
// 2- create order
// 3- resolve the other repository
// 4- create order
// 5- return the operation result
}
}
然后你的控制器将被注入订单处理器…
public class OrderController : BaseController
{
private IOrderProcessor ordeProcessor;
public OrderController (IOrderProcessor processor)
{
this.ordeProcessor= processor;
}
public ActionResult Create (OrderOL obj)
{
var result = processor.Process(obj)
return view();
}
}
注册组件…
container.RegisterType<IOrderRepository, OrderRepositorySQL>("sql", null);
container.RegisterType<IOrderRepository, OrderRepositoryMongo>("mongo", null);
container.Resolve<IOrderRepository>("sql");
container.Resolve<IOrderRepository>("mongo");