我将在使用WebAPI.2的MVC.5应用程序中使用SimpleInjector
MVC控制器的某些方法将为CRUD操作创建存储库对象。 Internet上的常见方法是MVC控制器中存储库的使用接口,如:
public class DashboardController : Controller
{
private readonly IDashboardRepository _repository;
public DashboardController (IDashboardRepository repository) {
_repository = repository;
}
[HttpPost]
public JsonData GetInfo()
{
return _repository.GetInfo();
}
...
建议WebAPI使用类似的方法
但是我不想将IDashboardRepository传递给控制器的构造函数,原因如下:我确信我永远不会模拟存储库的实现。我不需要单独的存储库公共接口(当前代码库没有这些接口,我需要更改大量文件来添加它们。)
我的存储库看起来像:
public class DashboardFunc : BaseFunc
{
public DashboardFunc(IApplicationStateProvider sp) :
base (sp)
{
}
public DashBoardData GetInfo()
{
...
我想在MVC的控制器中使用这样的代码:
public class DashboardController:Controller {
public DashboardController () {
}
[HttpPost]
public JsonData GetInfo()
{
DashboardFunc dashBoard = Global.MvcContainer.GetInstance<DashboardFunc>();
return Common.ToJson(dashBoard.GetInfo());
}
我想要的WebAPI控制器方法。唯一的区别是 DashboardFunc dashBoard = Global.WebApiContainer.GetInstance();
我的修改(不使用控制器中的存储库接口)标准方法可以吗?未来是否会出现可能导致架构变更的潜在问题?
谢谢!
答案 0 :(得分:4)
防止回拨Global.MvcContainer.GetInstance
或任何其他形式的Service Location
anti-pattern。即使您不想测试该代码,也有很多缺点。使用它的缺点是(除其他外):
所以即使你不需要那个接口,我也会建议仍然使用构造函数注入并执行以下操作:
public class DashboardController : Controller {
private readonly DashboardFunc dashboard;
public DashboardController(DashboardFunc dashboard) {
this.dashboard = dashboard;
}
[HttpPost]
public JsonData GetInfo() {
return Common.ToJson(this.dashBoard.GetInfo());
}
}