我已经看到了两种不同的方法来创建通用存储库.这两种方法之间有什么区别(利弊)?请对方法有所区别,因为我对它们之间的区别感兴趣
public interface IRepository<T> where T : class
Run Code Online (Sandbox Code Playgroud)
和
public interface IRepository : IDisposable
Run Code Online (Sandbox Code Playgroud)
功能,灵活性,单元测试有什么不同......?我会得到或失去什么?
它们在依赖注入框架中的注册方式有何不同?
选项1
public interface IRepository<T> where T : class
{
T Get(object id);
void Attach(T entity);
IQueryable<T> GetAll();
void Insert(T entity);
void Delete(T entity);
void SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
选项2
public interface IRepository : IDisposable
{
IQueryable<T> GetAll<T>();
void Delete<T>(T entity);
void Add<T>(T entity);
void SaveChanges();
bool IsDisposed();
}
Run Code Online (Sandbox Code Playgroud) 我仍然在寻求建立(和理解)解耦,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次.这里的最佳做法是什么?