C# 如何将对象生成器注入MVC控制器?
我正在从事ASP.NETMVC项目。为了将视图模型映射到域实体,我决定使用构建器模式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
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...
}
}