存储库模式与DTO模式方法

时间:2012-08-28 10:48:32

标签: 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. 如果我必须添加其他方法,例如 FindAllUsers FindUserByUserId DeleteUserByUserId 我应该采用哪种方法?

3 个答案:

答案 0 :(得分:11)

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

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

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

答案:

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

答案 1 :(得分:1)

它严格取决于您完成所需的工作以及应用的大小。如果您想要快速开发且可扩展性较低的东西,则不需要使用n层类型的架构(我的意思是将数据交互与数据访问层分开)。

但是,如果您正在寻找需要高度可扩展,可编辑,可修改并且知道它将获得未来功能的内容,那么显然您必须将您的内容分开,以使您的工作在更长的时间内更轻松。

最后,正如我所说,每种方法都有用,只要在开始工作之前知道你的目的是什么。

干杯。

答案 2 :(得分:0)

如果您遵循DDD guidelines,则实体不应依赖于 基础设施:

尼古拉的IoC第一定律

仅在IoC容器中存储服务。不要存储任何实体。

原因:通过将基础架构逻辑包含到您的实体中,您正在摆脱单一责任原则。参见Mark Seemann的explanation

第二种方法的问题是User实体依赖于基础结构。