首页 > 解决方案 > 如何将对象构建器注入 MVC 控制器?

问题描述

我正在开发 ASP.NET MVC 项目。为了将视图模型映射到域实体,我决定使用构建器模式。PtoRequest,UtoRequest是域的一部分,继承自TimeOffRequest实现ITimeOffRequest. 对于他们每个人,我都有一个单独的构建器。每个构建器都实现IRequestBuilder. 我遇到的问题是如何将这些构建器注入控制器(假设我不必为每种类型的请求注入一个构建器)?

代码:

public class TimeOffManager : Controller
{
   private readonly IUnitOfWork _uow;

   public TimeOffManager(IUnitOfWork uow)
   {
       _uow = uow;
   }

   [HttpPost]
   public ActionResult RequestPto(PtoFormVm vm)
   {
       //validate view model...

       ITimeOffRequest pto = new PtoRequestBuilder()
                               .Id(vm.Id)
                               .InRange(vm.StartDate, vm.EndDate)
                               .State((RequestState)vm.State)
                               .Note(vm.Comment)
                               .Build();
       // Etc...
   }

   [HttpPost]
   public ActionResult RequestUto(UtoFormVm vm)
   {
       //validate view model...

       ITimeOffRequest uto = new UtoRequestBuilder()
                               .Id(vm.Id)
                               .IsFullDay(vm.FullDay)
                               .InRange(vm.StartDate, vm.EndDate)
                               .State((RequestState)vm.State)
                               .Note(vm.Comment)
                               .Build();
       // Etc...
   }
}

标签: c#asp.net-mvcdependency-injectioninversion-of-control

解决方案


像这样?

public class TimeOffManager : Controller
{
   private readonly IUnitOfWork _uow;
   private readonly IRequestBuilder ptoBuilder;
   private readonly IRequestBuilder utoBuilder;

   public TimeOffManager(IUnitOfWork uow, IRequestBuilder ptoBuilder, IRequestBuilder utoBuilder)
   {
       _uow = uow;
       this.ptoBuilder = ptoBuilder;
       this.utoBuilder = utoBuilder;
   }

   [HttpPost]
   public ActionResult RequestPto(PtoFormVm vm)
   {
       //validate view model...

       ITimeOffRequest pto = ptoBuilder
                               .Id(vm.Id)
                               .InRange(vm.StartDate, vm.EndDate)
                               .State((RequestState)vm.State)
                               .Note(vm.Comment)
                               .Build();
       // Etc...
   }

   [HttpPost]
   public ActionResult RequestUto(UtoFormVm vm)
   {
       //validate view model...

       ITimeOffRequest uto = utoBuilder()
                               .Id(vm.Id)
                               .IsFullDay(vm.FullDay)
                               .InRange(vm.StartDate, vm.EndDate)
                               .State((RequestState)vm.State)
                               .Note(vm.Comment)
                               .Build();
       // Etc...
   }
}

除此之外,为什么你有一个实现接口的抽象类?抽象类已经是多态的......


推荐阅读