我目前正在一个项目中使用 ASP.NET MVC 框架(几乎是我的第一次)
我使用 Linq2SQL 作为我的数据模型..
我应该在哪里有这种代码:
var entries = from e in db.sometable select e;
我目前在控制器中有这种代码,并将我得到的数据传递到视图中..
这个可以吗?
如果不是,我如何让我的 linq2sql 数据模型包含这种代码?
谢谢
丹尼尔
我目前正在一个项目中使用 ASP.NET MVC 框架(几乎是我的第一次)
我使用 Linq2SQL 作为我的数据模型..
我应该在哪里有这种代码:
var entries = from e in db.sometable select e;
我目前在控制器中有这种代码,并将我得到的数据传递到视图中..
这个可以吗?
如果不是,我如何让我的 linq2sql 数据模型包含这种代码?
谢谢
丹尼尔
要添加@Poco 所说的内容,这是一个示例:
在Foo.Common.Repositories
(Foo.Common
项目内部):
public interface IRepository<T>
{
IEnumerable<T> GetAll();
void Update(T entity);
void Add(T entity);
void Delete(T entity);
void Save();
}
public interface IUserRepository : IRepository<User>
{
void GetByCredentials(string username, string password);
}
内部Foo.Data.Repositories
(内部Foo.Data
项目):
public class UserRepository
{
// ... other methods/properties snipped.
public IEnumerable<User> GetAll()
{
// Where this.Users would be L2Sql or Code-First... or some other ORM.
return from u in this.Users orderby u.Name select u;
}
}
然后在你的实际中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));
}
MVC 通常使用存储库模式。通常,您定义一个接口,例如 IProducts,然后实现该接口,调用您的 linq2sql 代码。您的控制器将接受此接口作为构造函数的参数,因此它依赖于此接口,而不是具体类。使用依赖注入器,例如 Ninject,将允许您向构造函数提供具体的接口实现。这可以在您的 Web 应用程序上启用单元测试,并且还增加了灵活性。
有一本非常好的书,Pro ASP.NET MVC 2 Framework,它解释了所有这些。我目前正在阅读它,我只是喜欢它。
在控制器方法中有 Linq 查询很好。
如果我们谈论关注点分离,其想法是您的数据层(在这种情况下,为您提供的存储库(?)代码db.sometable
)将您的逻辑代码(在这种情况下为控制器方法)与数据存储区分离。
您查询数据层而不是数据库,因此您可以更改底层数据存储并且您的控制器代码仍然可以工作。
有些人会争辩说,最好将尽可能多的逻辑代码移出控制器并移入模型代码(请参阅此处的第一个答案),但这取决于您想走多远。
这是一个如何实现存储库模式的示例
除此之外,我将实现一个附加层来处理您的应用程序业务逻辑并保持您的控制器轻量级