顺序实现一个调用使用统一依赖注入

本文关键字:调用 依赖 注入 一个 实现 顺序 | 更新日期: 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");