如何将对象构建器注入 MVC 控制器?
How to inject object builders into MVC controller?
我正在处理 ASP.NET MVC 项目。为了将视图模型映射到域实体,我决定使用构建器模式。 PtoRequest
、UtoRequest
是域的一部分,继承自实现 ITimeOffRequest
的抽象 TimeOffRequest
class。对于他们每个人,我都有一个单独的构建器。每个构建器实现 IRequestBuilder
。我遇到的问题是如何将这些构建器注入控制器(假设我不必为每种类型的请求注入一个构建器)?
- Pto - 带薪休假
- Uto - 无薪休假
代码:
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...
}
}
像这样?
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...
}
}
除此之外,为什么你有一个实现接口的抽象class?抽象 class 已经是多态的...
我正在处理 ASP.NET MVC 项目。为了将视图模型映射到域实体,我决定使用构建器模式。 PtoRequest
、UtoRequest
是域的一部分,继承自实现 ITimeOffRequest
的抽象 TimeOffRequest
class。对于他们每个人,我都有一个单独的构建器。每个构建器实现 IRequestBuilder
。我遇到的问题是如何将这些构建器注入控制器(假设我不必为每种类型的请求注入一个构建器)?
- Pto - 带薪休假
- Uto - 无薪休假
代码:
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...
}
}
像这样?
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...
}
}
除此之外,为什么你有一个实现接口的抽象class?抽象 class 已经是多态的...