我正在寻找在一个小项目中使用IRepository模式(由NHibernate支持,如果它很重要)。这个域是一个简单的域,故意让我专注于理解IRepository模式。单独域名类别为Movie
,属性为Year
,Genre
和Title
。我的意图是“获得”电影的属性符合上述类型的标准。我正确使用IRepository吗?
公约似乎有一个通用的IRepository
接口,类似于以下内容:
public interface IRepository<T>
{
T Get(int id);
T[] GetAll();
void Add(T item);
void Update(T item);
void Delete(T item);
}
有了基本实现:
public abstract class Repository<T> : IRepository<T>
{
public T Get(int id) { ... }
public T[] GetAll() { ... }
public void Add(T item) { ... }
public void Update(T item) { ... }
public void Delete(T item) { ... }
}
然后有一个特定领域的接口:
public interface IMovieRepository
{
Movie[] GetByGenre(Genre genre);
Movie[] GetByYear(int year);
Movie[] GetByTitle(string title);
}
通过一个实现也扩展了基地Repository
类:
public class MovieRepository : Repository<Movie>, IMovieRepository
{
public Movie[] GetByGenre(Genre genre) { ... }
public Movie[] GetByYear(int year) { ... }
public Movie[] GetByTitle(string title) { ... }
}
我需要必要的执行添加到基类以及具体的一个,使用NHibernate的,但我想知道如果我在正确的轨道与此设置上。
对于只有一个域类而言似乎存在一点点的开销,但是如果涉及多个域类,它将不太明显。现在我正在努力保持简单,以便我可以确定这个概念。
我喜欢你的建议,使用非抽象的'Repository'来处理从特定回购委托授权的通用低级CRUD类型的工作。它的确提出了将'ISession'用于通用回购和使用它的特定回购的问题。 – 2010-08-03 15:26:26
ISession应该通过Repository中的私有ISessionFactory获取。具体的存储库然后使用通用存储库的WrapxxxInSession方法。 – Goblin 2010-08-03 16:57:59
啊,是的,这有帮助。我非常喜欢整体想法......另一个好处是注入的IRepository可以被模拟进行测试。将会有按照正确的顺序构造和传递对象的技巧,但IoC工具可能会处理它。 – 2010-08-03 17:13:55