我正在尋找在一個小項目中使用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