Asp.net mvc 我的CRUD LINQ代码去哪里了?ASP.NETMVC

Asp.net mvc 我的CRUD LINQ代码去哪里了?ASP.NETMVC,asp.net-mvc,model-view-controller,separation-of-concerns,Asp.net Mvc,Model View Controller,Separation Of Concerns,我目前正在一个项目中使用ASP.NET MVC框架(这几乎是我第一次) 我正在使用Linq2SQL作为我的数据模型 我应该在哪里拥有此类代码: var entries = from e in db.sometable select e; 我目前在控制器中有类似的代码,并将获取的数据传递到视图中 这样行吗 如果不是,我如何将我的linq2sql数据模型插入到包含此类代码中 谢谢 DanielMVC通常使用存储库模式。 通常,您定义一个接口,例如IPProducts,然后实现这个接口,调用linq

我目前正在一个项目中使用ASP.NET MVC框架(这几乎是我第一次)

我正在使用Linq2SQL作为我的数据模型

我应该在哪里拥有此类代码:

var entries = from e in db.sometable select e;
我目前在控制器中有类似的代码,并将获取的数据传递到视图中

这样行吗

如果不是,我如何将我的linq2sql数据模型插入到包含此类代码中

谢谢


Daniel

MVC通常使用存储库模式。 通常,您定义一个接口,例如IPProducts,然后实现这个接口,调用linq2sql代码。控制器将接受此接口作为构造函数的参数,因此它依赖于此接口,而不是具体的类。使用依赖项注入器(如Ninject)将允许您向构造函数提供具体的接口实现。这可以在web应用程序上进行单元测试,还可以增加灵活性


有一本非常好的书,Pro ASP.NET MVC 2框架,解释了所有这些。我目前正在阅读它,我非常喜欢它。

在控制器方法中使用Linq查询是很好的

如果我们谈论的是关注点分离,那么我们的想法是,您的数据层(在本例中,是为您提供
db.sometable
)的存储库(?)代码将逻辑代码(在本例中是控制器方法)与数据存储分离

您查询的是数据层而不是数据库,因此您可以更改底层数据存储,并且控制器代码仍然可以工作


有些人可能会争辩说,最好还是将尽可能多的逻辑代码移出控制器,放入模型代码中(请参阅),但这取决于您想走多远。

下面是一个如何实现


除此之外,我还将实施一个附加层来处理您的应用程序业务逻辑,并保持您的控制器的轻量级

要添加@Poco所说的内容,下面是一个示例:

Foo.Common.Repositories
中(在
Foo.Common
项目中):

然后在实际的
Foo.Web
中:

public class UserController : Controller
{
    private readonly IUserRepository userRepository;

    public UserController(IUserRepository userRepository)
    {
         this.userRepository = userRepository;
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult List()
    {
        var users = this.userRepository.GetAll();
        return this.View(users);
    }
}
在您的
Global.asax
中,您将有Ninject或其他IoC容器来解析
IUserRepository

public static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IUserRepository>().To<UserRepository>();
}

protected void Application_Start()
{
    var kernel = new StandardKernel();

    AreaRegistration.RegisterAllAreas();

    MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters);
    MvcApplication.RegisterRoutes(RouteTable.Routes);
    MvcApplication.RegisterServices(kernel);

    // I'm using MVC3 here:
    DependencyResolver.SetResolver(new NinjectResolver(kernel));
}
publicstaticvoidregisterservices(IKernel内核)
{
kernel.Bind().To();
}
受保护的无效应用程序\u Start()
{
var kernel=新的标准内核();
RegisterAllAreas();
mvcapApplication.RegisterGlobalFilters(GlobalFilters.Filters);
MVCAPApplication.RegisterRoutes(RouteTable.Routes);
注册服务(内核);
//我在这里使用MVC3:
SetResolver(新的NinjectResolver(内核));
}
public class UserController : Controller
{
    private readonly IUserRepository userRepository;

    public UserController(IUserRepository userRepository)
    {
         this.userRepository = userRepository;
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult List()
    {
        var users = this.userRepository.GetAll();
        return this.View(users);
    }
}
public static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IUserRepository>().To<UserRepository>();
}

protected void Application_Start()
{
    var kernel = new StandardKernel();

    AreaRegistration.RegisterAllAreas();

    MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters);
    MvcApplication.RegisterRoutes(RouteTable.Routes);
    MvcApplication.RegisterServices(kernel);

    // I'm using MVC3 here:
    DependencyResolver.SetResolver(new NinjectResolver(kernel));
}