1

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

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

4

1 回答 1

2

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

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

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

于 2012-05-24T12:49:04.293 回答