我目前正在项目中使用ASP.NET MVC框架(几乎是我的第一次)
我使用Linq2SQL作为我的数据模型..
我应该在哪里有这样的代码:
var entries = from e in db.sometable select e;
我目前在控制器中有这样的代码,并将数据传递到视图中..
这样可以吗?
如果不是我如何让我的linq2sql数据模型包含这种代码?
由于
丹尼尔
答案 0 :(得分:5)
要添加@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));
}
答案 1 :(得分:2)
对MVC使用Repository模式很常见。 通常,您定义一个接口,例如IProducts,然后,您实现此接口,调用linq2sql代码。您的控制器将接受此接口作为构造函数的参数,因此它依赖于此接口,而不是具体类。使用依赖注入器(如Ninject)将允许您为构造函数提供具体的接口实现。这样可以在您的Web应用程序上进行单元测试,并且还可以增加灵活性。
有一本非常好的书,Pro ASP.NET MVC 2 Framework,它解释了所有这些。我正在读它,我只是喜欢它。
答案 2 :(得分:0)
在控制器方法中使用Linq查询很好。
如果我们谈论的是关注点的分离,那么我们的想法是你的数据层(在这种情况下,为你提供db.sometable
的存储库(?)代码)解耦你的逻辑代码(这里的控制器方法) case)来自数据存储区。
您查询数据层而不是数据库,因此您可以更改基础数据存储区,您的控制器代码仍然有效。
有些人认为最好再次将尽可能多的逻辑代码从控制器移到模型代码中(参见the first answer here),但这取决于你想要走多远。
答案 3 :(得分:0)
以下是如何实施repository pattern
的示例除此之外,我还将实现一个额外的层来处理应用程序业务逻辑并保持控制器的轻量级