现在,在较小的项目中,我在三种方法之间挣扎。我想选择其中一个一贯使用。
我已经放了示例代码,下面是优缺点。但基本上,这3种方法归结为:
为什么有经验的开发人员会选择一种方法而不是另一种?
这些方法有什么好处/缺点 - 作为初学者 - 我可能不知道?
更新
我很欣赏这些模式可能不会用于较大的项目,这些项目往往在结构上更复杂。
但实际上我对使用它们时的不同感兴趣。
接近一个
控制器
中的所有数据库工作和虚拟化流程让您轻松掌握简单应用程序的进展情况......
...但是'胖'控制器可能会模糊对复杂应用程序的理解。
MS在MVC模板中使用的默认值
public class ModelOne
{
public int ID { get; set; }
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
// etc...
}
public class EditModelOnePropAViewModel
{
public EditModelOnePropAViewModel(ModelOne model)
{
ID = model.ID;
PropA = model.PropA;
}
public string PropA { get; set; }
public int ID { get; set; }
}
public class ControllerOne : Controller
{
private ApplicationDbContext DB = new ApplicationDbContext() { };
[HttpGet]
public ActionResult Edit(int id)
{
var model = DB.ModelOneDbSet.FirstOrDefault(i => i.ID);
var viewModel = new EditModelOnePropAViewModel(model);
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(EditModelOnePropAViewModel postedModel)
{
if (ModelState.IsValid)
{
var model = DB.ModelOneDbSet.FirstOrDefault(i = i.ID == postedModel.ID);
model.PropA = postedModel.PropA;
DB.SaveChanges();
return RedirectToAction("index");
}
return View(postedModel);
}
}
接近两个
DB从Controller
传递到ViewModel控制器太薄了#39;和愚蠢的#39;
因为我们正在使用控制器的数据库实例,所以它将在DB对象上调用它的Dispose()方法。
public class ModelTwo
{
public int ID { get; set; }
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
// etc...
}
public class EditModelTwoPropAViewModel
{
public EditModelTwoPropAViewModel(ApplicationDbContext db, int id)
{
ID = id;
PropA = db.ModelTwoDbSet
.Where(i => i.ID == id)
.Select(i => i.PropA)
.FirstOrDefault();
}
public void SaveChanges(ApplicationDbContext db)
{
var modelTwo = db.ModelTwoDbSet.FirstOrDefault(i => i.ID == ID);
modelTwo.PropA = PropA;
db.SaveChanges();
}
public string PropA { get; set; }
public int ID { get; set; }
}
public class ControllerTwo : Controller
{
private ApplicationDbContext DB = new ApplicationDbContext() { };
[HttpGet]
public ActionResult Edit(int id)
{
var viewModel = new EditModelTwoPropAViewModel(DB, id);
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(EditModelTwoPropAViewModel postedModel)
{
if (ModelState.IsValid)
{
postedModel.SaveChanges(DB);
return RedirectToAction("index");
}
return View(postedModel);
}
}
接近三
与Two相同,但在ViewModel中使用(使用)创建了数据库。
public class ModelThree
{
public int ID { get; set; }
public string PropA { get; set; }
public string PropB { get; set; }
public string PropC { get; set; }
// etc...
}
public class EditModelThreePropAViewModel
{
public EditModelThreePropAViewModel(int id)
{
using (var db = new ApplicationDbContext())
{
ID = id;
PropA = db.ModelThreeDbSet
.Where(i => i.ID == id)
.Select(i => i.PropA)
.FirstOrDefault();
}
}
public void SaveChanges()
{
using (var db = new ApplicationDbContext())
{
var modelThree = db.ModelThreeDbSet.FirstOrDefault(i => i.ID == ID);
modelThree.PropA = PropA;
db.SaveChanges();
}
}
public string PropA { get; set; }
public int ID { get; set; }
}
public class ControllerThree : Controller
{
[HttpGet]
public ActionResult Edit(int id)
{
var viewModel = new EditModelThreePropAViewModel(id);
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(EditModelThreePropAViewModel postedModel)
{
if (ModelState.IsValid)
{
postedModel.SaveChanges();
return RedirectToAction("index");
}
return View(postedModel);
}
}
答案 0 :(得分:1)
您的问题太广泛,包含许多不同方面。所以我试着给你一个非常普遍的看法。软件设计没有任何错误或正确。有"项目需求和规格"。但通常它已被接受使用"设计模式和原则"使项目更加健壮,可靠且易于维护,使您的代码能够松散耦合,并具有高度凝聚力。#/ p>
考虑到这些,我会对你的选择给出我的看法:
最后,考虑您的项目需求和规格,设计您的架构并遵循基于"设计模式和原则"的架构。有关设计模式的更多信息,我推荐书和#34;专业ASP.NET设计模式"来自" Scott Millett"。