C# 如何以正确的方式实现存储库模式?
在为我的ASP.NET项目实现存储库模式时,我遇到了一些无法解决的问题。因此,关于如何以正确的方式实现存储库模式,我有几个问题 根据我的经验,我认为只有在我的应用程序中,在它们的存储库旁边有没有行为的类/模型是不好的OOP。但是,这就是我实现存储库模式的方式。我只是在我需要的任何地方创建一个存储库实例,以执行一些操作。这种方法的结果是我所有的域类都没有行为 它们只是保存数据的对象,没有任何方法。我的老师对我说我用的是瘦模特,我应该努力做胖模特。 作为对反馈的回应,我在类中实现了一些业务逻辑,但遇到了一些问题: 场景: 我的C# 如何以正确的方式实现存储库模式?,c#,asp.net,architecture,repository-pattern,C#,Asp.net,Architecture,Repository Pattern,在为我的ASP.NET项目实现存储库模式时,我遇到了一些无法解决的问题。因此,关于如何以正确的方式实现存储库模式,我有几个问题 根据我的经验,我认为只有在我的应用程序中,在它们的存储库旁边有没有行为的类/模型是不好的OOP。但是,这就是我实现存储库模式的方式。我只是在我需要的任何地方创建一个存储库实例,以执行一些操作。这种方法的结果是我所有的域类都没有行为 它们只是保存数据的对象,没有任何方法。我的老师对我说我用的是瘦模特,我应该努力做胖模特。 作为对反馈的回应,我在类中实现了一些业务逻辑,但遇
User
类中有一个朋友列表,其中包含用户对象,用于表示某个用户的朋友。向用户添加新朋友时,域类方法会检查“朋友”是否已存在于朋友列表中。如果没有,他将被列入名单。这些更改需要发送到数据库进行持久化
我知道这必须在每个域类的存储库中完成,但是对存储库方法的调用在应用程序的体系结构中属于哪里
现在,我在域类方法本身中调用repository方法,以持久化对数据库的更改:
public void AddFriend(User friend)
{
foreach(User f in Friends)
{
if(f.Username == friend.Username)
{
throw new Exception(String.Format("{0} is already a friend.", friend.Username));
}
}
Friends.Add(friend);
userRepo.AddFriend(this.Id, friend.Id);
}
这是一个好方法吗?因为某些原因,我认为它不是。关于单元测试,我们需要使用这种方法进行一些依赖性注入,这对我来说,它不是一个独立的类(良好的可测试单元)。我读过一些人的帖子,说他们使用了额外的服务层或其他东西。我认为这里需要这种抽象,但是某个服务层看起来是什么样的呢?其中包含哪些内容、哪些方法等
我看到其他一些学生在域类中使用静态方法,该类提供了添加新对象、更新对象、删除对象和获取所有对象等功能
例如:
public class Tram
{
private static TramRepository Repo = new TramRepository(new DBTram());
public static void AddTram(int tramID, TramType type, int lineNr)
{
Tram tram = new Tram(tramID, type, TramStatus.depot, lineNr, true, null);
Repo.AddTram(tram);
}
public static List<Tram> GetAll()
{
Repo.GetAll();
}
}
公共级有轨电车
{
私有静态TramRepository Repo=newtramrepository(newdbtram());
公共静态void AddTram(内部tramID、TramType类型、内部lineNr)
{
Tram Tram=新Tram(tramID、类型、TramStatus.DEPOTE、lineNr、true、null);
回购AddTram(有轨电车);
}
公共静态列表GetAll()
{
Repo.GetAll();
}
}
我发现有一个方法在域类中向数据库添加一个新实体是一件奇怪的事情,这就是实体本身。同样对于GetAll()方法,我认为在类本身中有一个获取所有tram的方法是很奇怪的。所以一个电车对象可以得到所有电车。我认为这是一种实现存储库模式的奇怪方式。我说得对吗
那么,这里需要什么样的抽象呢?必须有额外的一层吗?如果是这样,这个层看起来是什么样子?(示例代码)或者我是在错误的方向上搜索,是否有另一种解决方案可以解决使用存储库模式进行单元测试的问题
我每次都会遇到这个架构问题,确保我需要得到答案
我发现很难解释清楚这个问题,但我希望你们能理解
这种方法的结果是,我所有的域类实际上都没有任何行为。它们只是保存数据的对象,没有任何方法
模块化编程带来了许多问题,因此他们发明了封装和面向对象语言来解决这些问题 只要您制作简单的网站,公开所有数据就可以了:
- 加载数据
- 显示数据
- 保存数据
Web开发人员没有被教导OOP。他们被教授一种简单的编程方法——引导他们进入简单的网站(这是政府所需要的)。你的问题绝对正常,但不要期望找到一个绝对的答案。欢迎来到软件行业 以下是我的看法: