2011-05-23 14 views
1

我正在考慮爲我寫的asp mvc intranet應用程序的automapper。我的控制器目前使用Unity依賴注入來創建,其中每個容器都獲得對請求唯一的依賴。Automapper和請求特定的資源

我需要知道,如果automapper可向使用請求特定資源ICountryRepository查找對象,像這樣....

domainObject.Country = CountryRepository.Load(viewModelObject.CountryCode); 

回答

3

夫婦選擇這裏。一個是做自定義解析:(假設COUNTRYCODE是一個字符串可能是一個字符串,等等)

.ForMember(dest => dest.Country, opt => opt.ResolveUsing<CountryCodeResolver>()) 

那麼你的解析器會:

public class CountryCodeResolver : ValueResolver<string, Country> { 
    private readonly ICountryRepository _repository; 

    public CountryCodeResolver(ICountryRepository repository) { 
     _repository = repository; 
    } 

    protected override Country ResolveCore(string source) { 
     return _repository.Load(source); 
    } 
} 

最後,你需要掛鉤在Unity到AutoMapper:

Mapper.Initialize(cfg => { 
    cfg.ConstructServicesUsing(type => myUnityContainer.Resolve(type)); 

    // Other AutoMapper configuration here... 
}); 

其中「myUnityContainer」是您配置的Unity容器。自定義解析器定義了一個成員與另一個成員之間的映射。我們經常爲所有字符串 - >國家映射定義一個全局類型轉換器,這樣我就不需要配置每一個成員。它看起來像這樣:

Mapper.Initialize(cfg => { 
    cfg.ConstructServicesUsing(type => myUnityContainer.Resolve(type)); 

    cfg.CreateMap<string, Country>().ConvertUsing<StringToCountryConverter>(); 

    // Other AutoMapper configuration here... 
}); 

然後轉換爲:

public class StringToCountryConverter : TypeConverter<string, Country> { 
    private readonly ICountryRepository _repository; 

    public CountryCodeResolver(ICountryRepository repository) { 
     _repository = repository; 
    } 

    protected override Country ConvertCore(string source) { 
     return _repository.Load(source); 
    } 
} 

在自定義類型轉換器,你不需要做任何特定成員映射。任何時候AutoMapper都會看到一個字符串 - >國家轉換,它使用上面的類型轉換器。

+0

感謝您提供豐富的答案!不幸的是,在配置automapper的時候,我沒有對容器的引用,因爲容器將是收到請求時由主容器創建的子容器。 – 2011-05-24 14:19:52