我正在尝试学习ASP.NET MVC 4,而且我对应该放置数据库查询的地方感到困惑。我有PHP背景,特别是CodeIgniter,我习惯于将所有数据库查询放入模型中。我有这个问题:
db.Orders.Where(order => order.columnName == columnName).SingleOrDefault();
基于此ASP.NET tutorial,我应该把它放在控制器中。但是,我发现了这个StackOverflow question,它说我应该把它放在模型中(类似于我以前在PHP中做的)。对同一问题的另一个答案提到了创建包含所有查询的存储库模式/类。
所以我的问题是,在代码维护(可读性,更改效果等)方面,以下选项有哪些优点和缺点?
答案 0 :(得分:4)
使用存储库模式处理此问题的简单方法。这不是最好的方法。但是会告诉你如何使用存储库模式来处理这个问题。
创建一个存储库来执行所有数据库事务
public interface IRepository
{
Order GetOrder(int orderId);
}
public class Repository : IRepository
{
YourDBContext db;
public Repository()
{
db = new YourDBContext ();
}
public User GetOrder(int orderId)
{
return db.Orders.FirstOrDefault(s=>s.OrderID==orderId);
}
}
您可以在同一个项目中创建它(在“数据访问逻辑”下)或为此创建一个单独的类库(并将其引用到您使用它的任何地方)。
现在在您的控制器中,在导入必要的命名空间后,只需创建存储库的对象并调用您感兴趣的方法
public OrderController :Controller
{
protected IRepository repo;
public OrderController()
{
repo=new Repository();
}
public OrderController(IRepository repositary)
{
// This constructor is for your Unit test project,
// you can pass a mock repository here
// Read dependency injection
repo=repository;
}
public ActionResult details(int id)
{
var order=repo.GetOrder(id);
if(order!=null)
{
return View(order);
}
}
}
如果认为您的观点需要,您可以考虑使用视图模型。在这种情况下,您需要从域对象中读取属性值,并将其设置为视图模型的实例并将其返回到您的视图。
随着代码/功能的增长,您可以将代码移动到不同的类/层/项目中。
答案 1 :(得分:0)
从我的角度来看,MVC中所谓的Model不是数据库的模型,而是具有创建视图所需的所有信息的类。这意味着该类与数据库完全断开连接,并且具有不同的结构和不同的信息。
控制器必须验证输入条件(请求的参数)将其发送到检索信息的类(如果您愿意,请调用它),获取数据并将其移动到模型中。
当然,如果您想将查询添加到控制器中,则可能会更难以测试控制器。使用其他方法可能更容易(您可以模拟存储库的类/接口,并且已做好准备)。
Byez .U