2012-05-24 68 views
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(); 
} 

我的問題是,我是在正確的軌道上?可以通過域名服務訪問默認值嗎?

回答

2

您的解決方案看起來很好,但根據您對默認國家的定義,可能會有更好的替代方案。

  • 如果你想在代碼中定義的默認值(例如,如果國家是一個值對象),這將是更好的有像靜態Country.Default屬性。與_settings.GetDefaultCountry()相比,複雜性更低,流暢度更高。

  • 如果Country是一個完整的存儲在數據庫中的布爾IsDefault字段的實體,我的直覺就是一個Repository對於GetDefaultCountry()方法來說是一個更好的地方。我不會爲此創建一個Repository。