2010-08-10 183 views
2

我有一個SearchServiceSearch()方法,從存儲庫檢索IEnumerable<Search>。這些對象直接來自LINQ To SQL。接下來,我使用AutoMapper將這些Search類型轉換爲SearchModel類型(例如,稍後將它們傳遞到控制器中)。AutoMapper:用戶特定映射

var searches = searchRepository.GetByUserID(userID);   
var models = Mapper.Map<IEnumerable<Search>, IEnumerable<SearchModel>>(searches); 

的問題是,Search有一個屬性DateCreated這是一個UTC DateTime。我需要根據登錄用戶的當地時區更正日期。我能做到這一點與foreach裏面的服務,像這樣:

var searches = searchRepository.GetByUserID(userID); 

foreach (var search in searches) 
{ 
    search.DateCreated = search.DateCreated.ToTimezone(userTimezoneID); 
} 

var models = Mapper.Map<IEnumerable<Search>, IEnumerable<SearchModel>>(searches); 

雖然這工作(可能是唯一的選擇),我想利用AutoMapper的IValueFormatter的。例如,我有一些其他的值格式化器,例如相對時間。

我的問題是:可以這樣做嗎?我不確定,因爲我想我需要將附加信息傳遞給AutoMapper,以便知道使用哪個時區ID進行轉換。我也試圖避免從Search - >User的關係中獲得這個關係,因爲當用戶登錄時(並且希望避免數據庫JOIN檢索它),我將它存儲在cookie中。如何將此時區ID傳遞給AutoMapper,以便它可以爲每個用戶執行自定義映射?

回答

5

我想你會想要使用AutoMapper與Custom Resolver。您的自定義解決方案將支持依賴注入。如果您使用的是IoC,則效果最佳,但您可以將用戶注入解析器並在ResolveCore方法內執行適當的邏輯。這裏有一個粗略的例子:

private readonly IUserContext _userContext; 

public MyResolver(IUserContext userContext) 
{ 
_userContext = userContext; 
} 

protected override String ResolveCore(object source) 
{      
// Calculate display date based on user context 
    return TheDate; 
} 

絕對檢查出自定義解析器文檔,雖然。

我希望它有幫助。