我正在尝试找出一种良好而干净的方法,让我的域模型访问我的数据库中创建新实体对象时定义的默认值。假设我使用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();
}
我的问题是,我是否走在正确的轨道上?是否可以通过域服务访问默认值?
答案 0 :(得分:2)
您的解决方案似乎很好,但根据您对默认国家/地区的定义,可能有更好的选择。
如果要在代码中定义默认值(例如,如果Country是值对象),那么使用静态Country.Default属性会更好。比_settings.GetDefaultCountry()更低的复杂性和更流畅。
如果Country是一个存储在数据库中的具有布尔IsDefault字段的完整实体,我的直觉是,Repository将是GetDefaultCountry()方法的更好位置。我不会为此创建一个存储库。