c# - 如何在存储库中的域模型上设置私有(private)字段

标签 c# asp.net domain-driven-design

我目前正在使用一个使用贫血领域模型的代码库,并且我正在尝试将更多逻辑移动到领域模型中以转向领域模型和领域驱动设计,但我正在努力解决以下问题。

我有一个名为 Job 的领域模型,它看起来像这样,

public class Job
{
   private DateTime _someOtherDate;
   private DateTime _lastUpdated;

   // this may be called from many different services
   public void SetLastUpdated()
   {
     _lastUpdated = DateTime.UtcNow;
   }
}

在某个时间点,在处理作业的过程中,我想将作业的最后更新日期设置为该特定时间点。为此,我为它创建了一个 public setter,如上所示。

当我从存储库中的数据库中撤回作业时出现问题,因为我现在没有该字段的公共(public) setter ,因为我已将其限制为 SetLastUpdated() .

有人可以建议我如何在检索作业时允许在存储库实现中设置此属性,而不是从限制调用 SetLastUpdated() 的服务中设置此属性吗? .

更新 1) 我已经更新了问题,因为使用开始日期是一个不好的例子。

更新 2) 从给出的答案来看,我能看到这样做的唯一方法是不在存储库中使用 AutoMapper,在 Job 类上添加一个构造函数来设置 _lastUpdated,然后使用它在构建要在存储库的作业检索方法中返回的作业时。

最佳答案

在我看来,您有多种选择。

选项 1

假设您的存储库有两个方法:

public IEnumerable<Job> ReadAll() { ... }
public int CreateJob(Job job) { ... }

您可以为 Job 类提供两个构造函数,一个接受 DateTime,另一个不接受。

public class Job
{
    public Job(DateTime startDate)
    {
        this.StartDate = startDate;
    }

    public Job() : this(DateTime.UtcNow)
    {

    }

    public DateTime StartDate { get; private set; }
}

这不会阻止服务调用“错误的”构造函数,但至少它向调用者传达了在没有 startDate 的情况下调用它的选项。

选项 2

使用两个不同的 Job 类。

您的存储库可能看起来像这样:

public IEnumerable<Job> ReadAll() { ... }
public int CreateJob(NewJob newJob) { ... }

NewJob 类可能如下所示:

public class NewJob
{
    public NewJob()
    {
        this.StartDate = DateTime.UtcNow;
    }

    public DateTime StartDate { get; private set; }
}

这更好地传达了意图,因为存储库的 Create 方法只接受 NewJob 的实例,因此模型的用户将被迫创建一个 NewJob 而不是 Job

选项 3

忽略存储库的 Create 方法中的 StartDate,并始终在该方法中将其设置为 DateTime.UtcNow。或者甚至在设置它的数据库中创建一个 Insert 触发器。

关于c# - 如何在存储库中的域模型上设置私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26590620/

相关文章:

c# - IServiceLocator.GetInstance(Type) 的意图与 IServiceProvider.GetService(Type) 的意图有何不同?

c# - 带有 Unauthorize 状态代码和 Content//response 的 HttpResponseMessage 没有必需的 WWW-Authenticate header 字段

c# - 如何将数据从网络表单页面发布到 HTTPHandler.ashx 文件?

c# - Entity Framework 6 使用另一条记录的值更新现有记录

c# - 如何在asp中的按钮内添加图像

c# - GridView 中的 ASP.NET 代码

c# - 读数据库中的字段没有出现在写数据库中是否正常?

php - 干净的 OO 结构与 SQL 性能

domain-driven-design - 在域驱动设计中,作为身份字段的 guid 是否更好?

c# - 从业务对象类自动生成 DataContract 类