Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以正确的方式实现存储库模式?_C#_Asp.net_Architecture_Repository Pattern - Fatal编程技术网

C# 如何以正确的方式实现存储库模式?

C# 如何以正确的方式实现存储库模式?,c#,asp.net,architecture,repository-pattern,C#,Asp.net,Architecture,Repository Pattern,在为我的ASP.NET项目实现存储库模式时,我遇到了一些无法解决的问题。因此,关于如何以正确的方式实现存储库模式,我有几个问题 根据我的经验,我认为只有在我的应用程序中,在它们的存储库旁边有没有行为的类/模型是不好的OOP。但是,这就是我实现存储库模式的方式。我只是在我需要的任何地方创建一个存储库实例,以执行一些操作。这种方法的结果是我所有的域类都没有行为 它们只是保存数据的对象,没有任何方法。我的老师对我说我用的是瘦模特,我应该努力做胖模特。 作为对反馈的回应,我在类中实现了一些业务逻辑,但遇

在为我的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的方法是很奇怪的。所以一个电车对象可以得到所有电车。我认为这是一种实现存储库模式的奇怪方式。我说得对吗

那么,这里需要什么样的抽象呢?必须有额外的一层吗?如果是这样,这个层看起来是什么样子?(示例代码)或者我是在错误的方向上搜索,是否有另一种解决方案可以解决使用存储库模式进行单元测试的问题

我每次都会遇到这个架构问题,确保我需要得到答案

我发现很难解释清楚这个问题,但我希望你们能理解

这种方法的结果是,我所有的域类实际上都没有任何行为。它们只是保存数据的对象,没有任何方法

  • 让一个应用程序依赖于在其存储库旁边只有模型/类的体系结构,这是好的OOP吗 没有行为的价值观
  • 不,当然不是,但这就是现在网络开发人员被教导的方式

    它回到了20世纪70年代的旧模块化编程风格(静态类+对象中的数据)
    模块化编程带来了许多问题,因此他们发明了封装和面向对象语言来解决这些问题

    只要您制作简单的网站,公开所有数据就可以了:

    • 加载数据
    • 显示数据
    • 保存数据
    如果您需要复杂的行为,那么问题就开始了-然后您的数据实际上是软件实现的一部分,并且您将其公开!当多个开发人员在同一个项目上工作时,这会导致严重的维护问题


    Web开发人员没有被教导OOP。他们被教授一种简单的编程方法——引导他们进入简单的网站(这是政府所需要的)。

    你的问题绝对正常,但不要期望找到一个绝对的答案。欢迎来到软件行业

    以下是我的看法:

  • 让一个应用程序依赖于在其存储库旁边只有模型/类的体系结构,这是好的OOP吗 没有行为的价值观
  • 我认为您试图实现一个存储库模式,但是您错过了更高的体系结构视图。大多数应用程序至少在3个层中解耦:视图(表示)、业务和数据访问。 存储库模式发生在DataAccess中,在这里可以找到纯数据对象。 但是这个数据访问层是由业务层使用的,您可以在其中找到域模型、具有业务行为和数据的类。 单元测试工作必须在业务层的域模型上进行。 这些测试不应该关心数据是如何存储的

  • 在应用程序的体系结构中,我在哪里调用存储库方法
  • 同样没有绝对的答案,但通常使用商业服务之类的东西是有意义的。这些服务可以安排不同域对象之间的流,并加载它们,并将它们保存在存储库中。 这基本上就是您在AddFriend类中所做的,它属于业务层

    关于单元测试,我们需要