Cie*_*iel 6 asp.net-mvc coding-style repository-pattern
我仍然在寻求建立(和理解)解耦,IoC,DI等现代编程约定的永恒追求.我正在试图弄清楚如何构建存储库.我已经检查了数据库抽象层设计的帖子- 以正确的方式使用IRepository?这是非常有帮助的,但我仍然遇到一些让我一直迷惑的问题.
我的程序现在有4层......
Web(项目| ASP.NET MVC应用程序) - 引用Models.dll和Persistence.dll
模型(域对象)
持久性(域对象的流畅nHibernate映射)
公用事业(提供商,存储库)
现在,我正在尝试编写一个简单的Membership Repository.我的第一个任务......?
当有人试图注册时,检查是否存在电子邮件地址.这似乎一切都很好 - 所以我去尝试找出放置它的位置.
起初,我只是将它放在MembershipProvider类CreateUser方法中.然而,这属于公用事业项目.到目前为止,Utilities还不了解nHibernate.只有Persistence Project对nHibernate有任何了解.
那么,我的CreateUser方法需要查询我的数据库.那么这里最好的做法是什么?我是否UserRepository在Persistence项目中创建了一个,并且只调用一个完整的方法CheckEmail?或者我只是将nHibernate .dll添加到我的Utilities项目中,并在Provider中编写会话查找?
在我的持久性项目中制作存储库以执行特定操作而不是创建提供程序似乎更多的工作.如果我必须为他们制作存储库,为什么我甚至会创建提供商?所有这些新方法的目的不是停止代码重复吗?但感觉就像保持"分开"我必须写相同的代码2或3次.这里的最佳做法是什么?
您的存储库确实应该在您的持久性程序集中实现。假设您正在对它们进行单元测试,您将为域程序集中的每个存储库定义接口。
您的CreateUser方法不应直接查询数据库来确定电子邮件地址是否已存在,而是在您的方法中创建一个单独的方法DoesEmailExist来负责执行该检查。每个方法都应该有一个单一的职责。
回应jfar的质疑:
没错,域定义了可以做什么,定义了诸如Domain.IUserRepository.Create(User user). 然而,该域没有定义任何实现。
假设您开始使用实体框架,您可能会创建一个Persistence实现域中定义的接口的程序集。因此,从上面的域接口开始,我们实现了该接口:
namespace Persistence
{
public class UserRepository : Domain.IUserRepository
{
public void Create(User user)
{
// use Entity Framework to persist a user
}
}
}
Run Code Online (Sandbox Code Playgroud)
举例来说,您的客户后来告诉您实现 NHibernate 持久层。幸运的是,我们的域与现有的持久层是分开的——它位于域中。因此,您可以轻松实现现有的域接口,而无需更改 MVC 应用程序中的任何代码 - 因为只知道您定义的接口,而不是实体框架实现。
然后,您的 IoC 容器可以配置为解析IUserRepository为实体框架或 NHibernate 实现,您的 MVC 应用程序并不关心这两种方式。
就程序集引用而言,Persistence程序集引用了Domain,而Domain毫无疑问没有引用Persistence。
这导致了一种易于测试和更改的解耦设计,从而更容易维护。
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
1529 次 |
| 最近记录: |