asp.net-mvc – 仍然在存储库和解耦,ASP.NET MVC上丢失
我仍然在寻求建立(和理解)解耦,IoC,DI等现代编程约定的永恒追求.我正在试图弄清楚如何构建存储库.我已经在
Database abstraction layer design – Using IRepository the right way?检查了这个帖子,这非常有帮助,但我仍然遇到了一些让我一直迷惑的问题.
我的程序现在有4层……
现在,我正在尝试编写一个简单的Membership Repository.我的第一个任务……? 当有人试图注册时,检查是否存在电子邮件地址.这似乎一切都很好 – 所以我去尝试找出放置它的位置. 首先,我只是将它放在MembershipProvider类的CreateUser方法中.然而,这属于公用事业项目.到目前为止,Utilities还不了解nHibernate.只有Persistence Project对nHibernate有任何了解. 那么,我的CreateUser方法需要查询我的数据库.那么这里最好的做法是什么?我是否在Persistence项目中创建UserRepository,并创建一个名为CheckEmail的整个方法?或者我只是将nHibernate .dll添加到我的Utilities项目中,并在Provider中编写会话查找? 在我的持久性项目中制作存储库以执行特定操作而不是创建提供程序似乎更多的工作.如果我必须为他们制作存储库,为什么我甚至会创建提供商?所有这些新方法的目的不是停止代码重复吗?但感觉就像保持“分开”我必须写相同的代码2或3次.这里的最佳做法是什么? 解决方法
您的存储库应该真正在Persistence程序集中实现.假设您正在对它们进行单元测试,您将为Domain程序集中的每个存储库定义接口.
您的CreateUser方法不应直接查询数据库以确定电子邮件地址是否已存在,而是在您的DoesEmailExist中创建一个单独的方法,该方法负责执行该检查.每种方法都应该有一个责任. 回应jfar的疑虑: 没错,域定义了可以做什么,定义了Domain.IUserRepository.Create(用户用户)等接口.但是,域不定义任何实现. 假设您开始使用Entity Framework,您可以创建一个Persistence程序集,它实现域中定义的接口.所以继上面的域界面后我们实现了接口: namespace Persistence { public class UserRepository : Domain.IUserRepository { public void Create(User user) { // use Entity Framework to persist a user } } } 比方说,您的客户稍后会告诉您实现NHibernate持久层.幸运的是,我们的域与现有的持久层是分开的 – 它位于域中.因此,您可以轻松实现现有的域接口,而无需更改MVC应用程序中的任何代码 – 因为所有知道的是您定义的接口,而不是实体框架实现. 然后可以将您的IoC容器配置为将IUserRepository解析为Entity Framework或NHibernate实现,您的MVC应用程序无关紧要. 就汇编引用而言,Persistence程序集具有对Domain的引用,而Domain恰当地没有对Persistence的引用. 这导致了解耦设计,易于测试,并且向前更改,从而使维护更容易. 我希望有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net * WebForms *开发人员将来可以期待什么?
- asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)
- 在asp.net按钮中添加图像和文本
- asp.net – 在IE11中无法正确显示站点
- asp.net-mvc – Html.Raw()在ASP.NET MVC Razor视图
- asp.net-mvc-3 – MVC3 WebGrid:可以在行/列上使用htmlAtt
- ASP.NET Core 2.0 支付宝扫码支付的实现代码
- 使用内部SecurityException抛出异常仅在ASP.NET MVC中显示内
- asp.net-mvc – 数以千计的重定向不好SEO?
- 将数据从asp.net-mvc传递到javascript的最佳做法
- asp.net – 无法在文本框中键入double
- asp.net-mvc – 字段必须是数字 如何将此消息更改
- asp.net – 输出缓存使用BOTH varybyparam和vary
- asp.net – 只有一次使用的功能是否应该在UserCo
- 有没有带语音记录示例代码的ASP.NET?
- asp.net-mvc-3 – 我可以在App_Code之外使用全局
- asp.net-mvc – 用于服务应用程序的Microsoft Gr
- asp.net – 需要密码输入清理吗?
- asp.net-mvc-3 – 不能使用NuGet PagedList ASP.
- asp.net-mvc – ASP.NET MVC,强类型视图,部分视图