Automapper a Dependency Injection

4

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".

Share.

About Author

Programista, trener, prelegent, pasjonat, blogger. Autor podcasta programistycznego: DevTalk.pl. Jeden z liderów Białostockiej Grupy .NET i współorganizator konferencji Programistok. Od 2008 Microsoft MVP w kategorii .NET. Więcej informacji znajdziesz na stronie O autorze. Napisz do mnie ze strony Kontakt. Dodatkowo: Twitter, Facebook, YouTube.

Comments are closed.