我是否正确使用了 IRepository?

2023-12-22

我希望在一个小项目中使用 IRepository 模式(如果重要的话,由 NHibernate 支持)。该域是一个简单的域,故意这样让我能够专注于理解 IRepository 模式。唯一的域类是Movie,其属性为Year, Genre, and Title。我的目的是“获得”其属性符合上述类型标准的电影。

约定似乎有一个通用的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 class:

public class MovieRepository : Repository<Movie>, IMovieRepository
{
    public Movie[] GetByGenre(Genre genre) { ... }
    public Movie[] GetByYear(int year) { ... }
    public Movie[] GetByTitle(string title) { ... }
}

我需要使用 NHibernate 向基类和具体类添加必要的实现,但我想知道我的设置是否正确。

仅一个域类似乎会产生相当大的开销,但如果涉及多个域类,开销就不那么明显了。现在我试图保持简单,这样我就可以确定这个概念。


  1. 尽量不要回传array. use IEnumerable<T>, ICollection<T> or IList<T>,这将进一步松散地耦合您的代码。

  2. 您的 IMovieRepository 界面。该存储库包含 CRUD。因此使它

IMovieRepository : IRepository<Movie> {}

这不会改变你的MovieRepository类,因为它将正确实现接口。如果您希望稍后更改实现,它将允许您解耦您的类。

最后。这对于其中一种方法来说很好。因为您有专门的功能,所以您有专门的存储库来适应。

还有其他方法,使您能够使用 1 个存储库类并传入所需的查询。这称为规范模式。我做了一个项目,它使用位于 codeplex 上的报告http://whiteboardchat.codeplex.com http://whiteboardchat.codeplex.com

另一种方法是有一种方法来传递标准。有一个名为 Sharp Architecture 的开源项目,我相信它已对此进行了编码。

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否正确使用了 IRepository? 的相关文章

随机推荐