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

时间:2014-05-30 00:37:53

标签: c# asp.net-mvc dependency-injection asp.net-mvc-5 unity-container

使用统一依赖注入在异步模式下实现顺序实现的最佳方法是什么。如果我调用一个方法来创建顺序,它应该在两个不同的实现中创建它。

我的控制器:

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
    }
}
使用ASP.NET MVC Unity

Global.asax AppStart事件

container.RegisterType<IOrderRepository, OrderRepositorySQL>();
container.RegisterType<IOrderRepository, OrderRepositoryMongo>();

申请详情

  • C#.NET 4.5
  • ASP.NET MVC 5
  • Unity 3.0

1 个答案:

答案 0 :(得分:0)

您无法做到这一点,您只能解决一个组件。实际上,当您尝试解析IOrderRepository时,这两行代码会在编译时或运行时发生冲突...

container.RegisterType<IOrderRepository, OrderRepositorySQL>();
container.RegisterType<IOrderRepository, OrderRepositoryMongo>();

基本上,您需要使用Named Type Registrations或向控制器注入一个包装器服务,该服务器将解析这两个组件(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");