2014-01-15 34 views
7

我想学习ASP.NET MVC 4,我很困惑,我应该把我的数据库查询。我有PHP的背景,特别是CodeIgniter,我习惯于将所有db查询放入模型中。我有这个疑问:ASP.NET MVC - 在哪里把数据库查询

db.Orders.Where(order => order.columnName == columnName).SingleOrDefault(); 

在此基础上ASP.NET tutorial,我应该把它放在控制器。然而,我发现这个StackOverflow question,它说我应该把它放在模型中(类似于我以前用PHP做的)。对同一问题的另一个答案提到了创建包含所有查询的存储库模式/类。

所以我的问题是,以下选项在代码维护(可读性,更改效果等)方面有哪些优缺点?

  1. 查询在控制器
  2. 查询在模型
  3. 查询,从我的角度所谓模型MVC点一个单独的类/层
+1

我们使用的设置是我们的数据是在模型中定义的,我们的查询是在我们称之为服务的类中定义的,控制器处理所有事情。所以在控制器上创建一个新模型,然后调用服务来填充模型,然后将填充的模型传递给视图 –

回答

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); 
    } 
    } 
} 

的方法,如果认为您的观点,您可以考虑使用一个视图模型需要它。在这种情况下,您需要从您的域对象读取属性值并将其设置为您的视图模型的实例并将其返回到您的视图。

随着代码/功能的增长,您可以将代码移动到不同的类/图层/项目。

0

不是数据库的模型,但该类包含您需要创建视图的所有信息。这意味着该类与数据库完全断开,并且具有不同信息的不同结构。

控制器必须验证输入条件(请求的参数)将其发送给检索信息的类(如果您愿意,可将其称为存储库),获取数据并将其移入模型中。

当然,如果你想添加查询到控制器,你可以,但会更难以测试控制器。使用其他方法可能会更容易(您可以模拟存储库的类/接口并且您已准备就绪)。

Byez .U