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: // conversion...
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”.