c# - 存储库模式与 DTO 模式方法

标签 c# java .net oop design-patterns

我们可以使用这两种方法将数据发送到数据访问层或任何其他来源:

方法 1: 入库方式:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

public class UserRepository
{
    public static void Add(User user)
    {
        // Add user logic
    }
    public static void Delete(User user)
    {
        // Delete user logic
    }
    public static User Get(int userid)
    {
        // Get user logic
    }
}

用法:

var user = new User
    {
        FirstName = "FirstName",
        LastName = "LastName",
        Age = 20
    };
UserRepository.Add(user);

在上面,您已经看到我使 User 类保持简单。它没有任何行为。行为被添加到一个单独的类 UserRepository 中。

第二种方法: 仅在 User.cs 中保留添加/删除/获取等:

   public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }

        public void Add()
        {
            // Add user logic
        }
        public void Delete()
        {
            // Delete user logic
        }
        public User Get()
        {
            // Get user logic
        }
    }

用法:

var user = new User
    {
        FirstName = "FirstName",
        LastName = "LastName",
        Age = 20
    };
user.Add();

以上我只在 User.cs 中保留了行为。这两种方法都用于添加、删除用户等目的。可以告诉我吗

  1. 哪种方法更好?

  2. 何时决定我们必须选择上述两种方法中的哪一种?

  3. 如果我还必须添加其他方法,例如 FindAllUsersFindUserByUserIdDeleteUserByUserId 我应该采用哪种方法?

最佳答案

第一种方法要好得多,因为您正在分离关注点,即域实体用户和数据库的持久性。

领域驱动设计中经常谈论的最重要的事情之一是“持久性无知”参见What are the benefits of Persistence Ignorance?

通过使用存储库模式,您保存/获取您的实体的方式被排除在实体代码之外,即您的域保持它的清洁并在本质上实现持久性无知(或者无论如何要走很长一段路)

所以答案:

  1. 存储库方法要好得多
  2. 始终选择选项 1
  3. 将这些方法添加到存储库类

关于c# - 存储库模式与 DTO 模式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157678/

相关文章:

java - 火力基地查询。数据快照

java - 多线程应用+Web应用

c# - HttpContext.Current.Items 的范围

c# - 银光异步

c# - 泛型规则和类型约束

c# - 使用 Azure Function 更新本地 AD 用户配置文件

C# RegEx 防止重复相同模式的贪婪匹配

c# - 如何管理数百个变量的保存/加载

c# - C# 中的多态性是否如此多态?

java - 数字范围从 0 到 31 的正则表达式,不包括前面的零