使用域服务访问域模型中的默认值

时间:2012-05-24 10:36:46

标签: c# domain-driven-design

我正在尝试找出一种良好而干净的方法,让我的域模型访问我的数据库中创建新实体对象时定义的默认值。假设我使用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();
}

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

1 个答案:

答案 0 :(得分:2)

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

  • 如果要在代码中定义默认值(例如,如果Country是值对象),那么使用静态Country.Default属性会更好。比_settings.GetDefaultCountry()更低的复杂性和更流畅。

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