gpt4 book ai didi

c# - 我是否正确使用 IRepository?

转载 作者:可可西里 更新时间:2023-11-01 08:26:38 25 4
gpt4 key购买 nike

我希望在一个小项目中使用 IRepository 模式(由 NHibernate 支持,如果它重要的话)。域是一个简单的域,有意让我专注于理解 IRepository 模式。单独的域类是 Movie,具有 YearGenreTitle 的属性。我的意图是“获取”其属性符合上述类型标准的电影。

约定似乎是有一个通用的IRepository接口(interface),类似于下面:

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) { ... }
}

然后有一个特定领域的接口(interface):

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 向基类和具体类添加必要的实现,但我想知道我是否在正确的轨道上进行此设置。

似乎只有一个域类的开销相当大,但如果涉及多个域类,它就不太明显了。现在,我尽量保持简单,以便确定这个概念。

最佳答案

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

  2. 您的 IMovieRepository 接口(interface)。这个存储库包括 CRUD。所以就去做吧

IMovieRepository : IRepository<Movie> {}

这不会改变您的 MovieRepository类,因为它将正确实现接口(interface)。如果您想在以后更改实现,它将允许您解耦类。

最后。这对于其中一种方法很好。由于您具有专门的功能,因此您专门设计了适合的存储库。

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

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

希望对你有帮助

关于c# - 我是否正确使用 IRepository?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com