C# 如何将对象生成器注入MVC控制器?

C# 如何将对象生成器注入MVC控制器?,c#,asp.net-mvc,dependency-injection,inversion-of-control,C#,Asp.net Mvc,Dependency Injection,Inversion Of Control,我正在从事ASP.NETMVC项目。为了将视图模型映射到域实体,我决定使用构建器模式PtoRequest,UtoRequest是域的一部分,从实现ITimeOffRequest的抽象类继承而来。对于每一个,我都有一个单独的构建器。每个生成器实现IRequestBuilder。我面临的问题是如何将这些构建器嵌入控制器(假设我不必为每种类型的请求嵌入一个构建器) Pto-带薪休假 Uto-无薪休假 代码: 像这样 public class TimeOffManager : Controller

我正在从事ASP.NETMVC项目。为了将视图模型映射到域实体,我决定使用构建器模式
PtoRequest
UtoRequest
是域的一部分,从实现
ITimeOffRequest
的抽象类继承而来。对于每一个,我都有一个单独的构建器。每个生成器实现
IRequestBuilder
。我面临的问题是如何将这些构建器嵌入控制器(假设我不必为每种类型的请求嵌入一个构建器)

  • Pto-带薪休假
  • Uto-无薪休假
代码:

像这样

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...
   }
}

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

您是否尝试过使用任何容器进行IOC控制反转?比如,可能是Unity容器?我使用DI容器通过控制器嵌入其他依赖项,但正如我在示例中所示,在不同的操作方法中有不同的构建器实例。我正试图找到一种方法将它们作为依赖项传递到控制器中,但不确定是否可以模拟抽象类,这就是我使用接口的原因。关于将构建器传递给构造函数。。。有没有可靠的方法避免一个接一个地经过他们?除了
IUnitOfWork
之外,我实际上还有三个其他参数。如果我添加每种类型的构造器,构造器中大约有十个参数。这可以吗?@БааааааПаааааПааааааПааааааа。请参阅:
TimeOffManager
几乎不违反SRP。对于每种类型的请求,都有一个单独的管理器控制器,这是一个很好的扩展。我想我必须在参数和类提取之间找到一个完美的平衡点……不过谢谢你的建议。它灵巧地帮助了我!
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...
   }
}