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

本文关键字:模型 默认值 访问 服务 | 更新日期: 2023-09-27 18:35:23

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

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

ISettingsService.cs (Domain Service):

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;
    }
}

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

用户服务.cs(应用程序服务):

using (var uow = new UnitOfWork())
{
    UserFactory factory = new UserFactory(uow.GetSettingsService());
    var user = factory.CreateFacebookUser(facebookUserId);
    ...
    uow.Save(user);
    uow.SubmitChanges();
}

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

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

您的解决方案似乎很好,尽管根据您对默认国家/地区的定义,可能会有更好的替代方案。

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

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