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