【问题标题】:Accessing default values in a domain model using domain services使用域服务访问域模型中的默认值
【发布时间】:2012-05-24 10:36:46
【问题描述】:

我正在尝试找出一个好的和干净的方法,让我的域模型访问在创建新实体对象时在我的数据库中定义的默认值。假设我正在使用 Facebook Connect 为我的网站创建新用户。由于我无法确定 Facebook 用户是否设置了国家/地区,因此我在创建新实体时需要访问默认国家/地区。

到目前为止,我已经使用单一方法 GetDefaultCountry() 创建了一个域服务 - 可能还会有更多。

ISettingsService.cs(域服务):

public interface ISettingsService
{
    Country GetDefaultCountry();
}

设置服务在基础设施层实现,可以通过我的UnitOfWork访问。然后我创建了一个工厂,它将设置服务作为参数。这负责创建用户实体。

UserFactory.cs(域工厂):

public class UserFactory
{
    private ISettingsService _settings;

    public UserFactory(ISettingsService settings)
    {
        _settings = settings;
    }
    public User CreateFacebookUser(string facebookUserId)
    {
        var user = new User();

        user.AccountType = AccountType.Facebook;
        user.ExternalId = facebookUserId;
        user.Country = _settings.GetDefaultCountry();
        user.Timestamp = DateTime.Now;

        return user;
    }
}

这就是我的用户服务的样子。

UserService.cs(应用服务):

using (var uow = new UnitOfWork())
{
    UserFactory factory = new UserFactory(uow.GetSettingsService());

    var user = factory.CreateFacebookUser(facebookUserId);
    ...
    uow.Save(user);
    uow.SubmitChanges();
}

我的问题是,我在正确的轨道上吗?可以通过域服务访问默认值吗?

【问题讨论】:

    标签: c# domain-driven-design


    【解决方案1】:

    您的解决方案似乎不错,但根据您对默认国家/地区的定义可能会有更好的选择。

    • 如果您想在代码中定义默认值(例如,如果 Country 是一个值对象),最好使用静态 Country.Default 属性。比 _settings.GetDefaultCountry() 更简单,更流畅。

    • 如果 Country 是一个完整的实体,存储在数据库中并带有一个布尔 IsDefault 字段,我的直觉是,对于 GetDefaultCountry() 方法来说,Repository 将是一个更好的地方。不过,我不会为此创建存储库。

    【讨论】:

      猜你喜欢
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多