存储库模式与DTO模式方法

Roc*_*ngh 6 .net c# java 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
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var user = new User
    {
        FirstName = "FirstName",
        LastName = "LastName",
        Age = 20
    };
UserRepository.Add(user);
Run Code Online (Sandbox Code Playgroud)

上面,您已经看到我保持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
        }
    }
Run Code Online (Sandbox Code Playgroud)

用法:

var user = new User
    {
        FirstName = "FirstName",
        LastName = "LastName",
        Age = 20
    };
user.Add();
Run Code Online (Sandbox Code Playgroud)

上面我只保留了User.cs中的行为.这两种方法都用于添加,删除等用户.你能让我知道吗

  1. 哪种方法更好?

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

  3. 如果我必须添加其他方法,如FindAllUsers, FindUserByUserId,DeleteUserByUserId我应该采用哪种方法?

bst*_*ack 11

第一种方法要好得多,因为您将关注点即域实体User和持久性分离到数据库.

领域驱动设计中经常谈到的最重要的事情之一就是"持久性无知".看看持久性无知有什么好处?

通过使用存储库模式,您保存/获取实体的方式不受实体代码的限制,即您的域保持清洁,实质上是实现持久性无知(或者无论如何都要走很长的路)

所以答案:

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

  • +1只是添加到此 - 使用存储库模式更加清晰 - 存储库*添加*用户,用户不*自己添加*. (6认同)