Inicjalizacja Automappera, oraz kreacja obiektów DAL

0

Cześć!

Pisze sobie projekcik asp.net core. Jest on podzielony na kilka projektów. Między innymi posiadam główną aplikację asp, oraz bibliotekę odpowiedzialną, za dostarczanie obiektów modeli. Mając model **Customer używam, klas DTO np. CustomerCreateModel. Za dodawanie i updatowanie odpowiada klasa CustomerStore, która ma m,in. metodę ** public bool Create(CustomerCreateModel customerCreateModel) Wewnątrz używam Automappera do przepisywania wartości DTO -> Model oraz Model -> DTO. Generalnie teraz zastanawiam się nad tym, jak zorganizować te mappery. Ogólnie z tego co wyczytałem w sieci, odchodzi się od stosowania statycznych struktur AutoMappera na rzecz DI. Wszystkie przykłady pokazują, że w klasie Startup.cs w projekcie ASP rejestruje się AutoMappery i tyle. Niemniej oni wszyscy używają tych mapperów w kontrolerach gdzie są wstrzykiwane. Nie sądzę, że to jest ok - chciałbym ukryć fakt, że w ogóle jest jakieś mapowanie robione w CustomerStore. Jeśli w konstruktorze CustomerStore przyjmował bym IMapper to za kreacje obiektu CustomerStoreodpowiadał by DI, który konstruuje całą aplikacje asp. Co w przypadku jak użyję mojej biblioteki, w której mam modele jako warstwa modeli do aplikacji WPF czy WinForms lub zupełnie inaczej - do jakiegoś serwisu do operacji wsadowych? Wtedy będzie trzeba przygotować dodatkową aplikacje/kod do kreacji moich obiektów DAL, żeby było wiadomo jakie implementacje IMapperów wstrzyknąć.

Macie pomysł jak to zorganizować, by wstrzykiwanie mapperów odbywało się w bibliotece modeli, ale nie koniecznie sztywno tworzone w konstruktorach danych DAL'i . Chciałbym inaczej mówiąc Stworzyć jakąś fabrykę w bibliotece modeli, która na podstawie konfiguracji zwróci mi odpowiedni mapper i wstrzyknie do DAL'a, a z kolei ta fabryka zostanie poproszona o daną implementacje DAL przez DI z aplikacji asp.mvc lub przez inną np. serwis windowsowy. Robiliście coś takiego? Co sądzicie o takim podejściu? Z góry dzięki za Wasz czas!

1

W każdej z warstw która ma wykorzystywać Automapper utwórz klasę dziedziczącą po klasie Profile (tej z automappera). Tam definiujesz odpowiednie mapowania.
W klasie Startup.cs przeskanuj projekty i wybierz te które mają klasy dziedziczące po klasie Profile i przekaż odpowiednią kolekcję typów Assembly jako parametr do wywołania metody services.AddAutomapper() (możesz oczywiście zrobić to w inny sposób bez skanowania). Wtedy w każdym miejscu aplikacji (które będzie miało jakiekolwiek pojęcie o Automapperze) będziesz mógł wstrzyknąć mapper poprzez interfejs IMapper

0

Dzięki za odpowiedź! Te Profile chciałem utworzyć w osobnej DLL, żeby podpiąć pod aplikacje asp, oraz pod bibliotekę z modelami. W Twoim rozumowaniu, przekazuję implementacje oraz konfiguracje do DI asp.mvc, a co jeśli będę chciał użyć biblioteki z mapperami w aplikacji konsolowej - wtedy będę musiał mieć osobny DI który wstrzyknie mappery, lub tworzyć obiekty DAL przez new i podawać do konstruktora odpowiedni mapper. Chciałbym, żeby biblioteka z modelami bez znaczenia z jakieś aplikacji jest uruchamiana poprawnie budowała DAL z mapperami, bez konieczności zewnętrznej konfiguracji i informowania zewnętrznego aplikacyjnego DI o tym.

1

Ja bym nie szedł w tą stronę z tego powodu, że będziesz miał warstwę która będzie musiała wiedzieć o każdym z projektów który korzysta z mappera. Będziesz miał w tej warstwie wszelkie możliwe przypadki użycia i wymieszane wszystkie możliwe konteksty. Dopóki ta aplikacja jest niewielka to może nie będzie stanowić wielkiego problemu ale w miarę rozwoju będzie coraz ciężej ogarnąć co jest mapowane z czego, na co i dlaczego. Lepiej jest trzymać to jednak podzielone projektami.

To oczywiste, że dla każdego z projektów musisz zbudować kontener jeśli chcesz korzystać z DI. No ale to chyba nie jest żaden problem jeśli zachowujesz izolację między warstwami - wtedy dowolna warstwa prezentacji (np konsola czy asp net core) może korzystać z dokładnie tych samych bebechów.

0

Dzięki za odpowiedź. Ciekaw jestem też innych opinii.

0

@var ma rację.

0

Z tymi profilami to rozumiem, jedna klasa dziedzicząca po Profile w jednej dll, i tam w środku wszystkie mapowania na wszystkie modele z danej dll?

1 użytkowników online, w tym zalogowanych: 0, gości: 1