W przykładzie z ostatniego posta wielu mogła nie podobać się następująca linijka:
1: string targetTimeZoneName = Config.TargetTimeZone;
I mają rację, gdyż można by to zamodelować jako zależność konwertera od konfiguracji - najlepiej przez constructor injection. Ale przecież Automapper sam tworzy konwertery, resolwery, formatery i wszystkie inne szmery bajery (reklama Ery?)...
HA! Nie było łatwo się do tego dokopać, ale poniższa instrukcja spowoduje, że wszystkie te "pomocnicze" typy będą instancjonowane przez Unity:
1: Mapper.Initialize(
2: config =>
3: config.ConstructServicesUsing(type => AppFacade.UnityContainer.Resolve(type))
4: );
Oczywiście można w ten sposób zintegrować dowolny kontener.
I nasza pierwotna klasa prezentuje się teraz tak:
1: public class UtcToLocalTimeConverter : TypeConverter<DateTime, DateTime>
2: {
3: private readonly IConfigProvider _configProvider;
4:
5: public UtcToLocalTimeConverter(IConfigProvider configProvider)
6: {
7: _configProvider = configProvider;
8: }
9:
10: protected override DateTime ConvertCore(DateTime source)
11: {
12: string targetTimeZoneName = _configProvider.Server_TimeZone;
13:
Nice.
Przyznać muszę, że Im bardziej poznaję Automappera (a zdarza mi się do niego wrócić raptem raz na kilka miesięcy), tym bardziej imponuje mi mnogość zawartych w nim "smaczków".