Mam abstrakcyjną klasę "Action", która wyprowadziła typy ActionAppointment, ActionCall, ActionEmail i ActionLetter. Próbuję napisać funkcję, która DRY się naszą warstwą usługi, więc nie piszemy już 5 razy połączeń CRUD.C# Pattern dla kodu klasy abstrakcyjnej specyficznej
mam w naszej warstwie usług pewną logikę aktualizacji (wiele innego kodu usunięte dla zwięzłość):.
private IServiceResponse UpdateAction<T>(T action, string originalActionStatus) where T : Action
{
if (action.GetType() == typeof(Action))
{
_actionRepository.Update(action);
}
else if (action.GetType() == typeof(ActionAppointment))
{
_actionAppointmentRepository.Update(action as ActionAppointment);
}
else if (action.GetType() == typeof(ActionCall))
{
_actionCallRepository.Update(action as ActionCall);
}
else if (action.GetType() == typeof(ActionEmail))
{
_actionEmailRepository.Update(action as ActionEmail);
}
else if (action.GetType() == typeof(ActionLetter))
{
_actionLetterRepository.Update(action as ActionLetter);
}
}
Niestety, jak nasze repozytoria są ustawione, muszę użyć specjalnie nazwanych repozytoriów (czyli ja nie można zaktualizować ActionLettera za pośrednictwem _actionRepository, mimo że pochodzi z Action)
Czytałem na różnych wzorach, i to brzmi jak coś podobnego do Factory Pattern, ale nie widzę jak to zrobić.
Czy brakuje mi czegoś głupiego?
Możesz wziąć pod uwagę wzorzec * Visitor * (http://en.wikipedia.org/wiki/Visitor_pattern). –
Tak, wzór fabryczny jest rozwiązaniem. Twoje repozytoria muszą mieć wspólną klasę podstawową lub implementować interfejs. Wszystkie muszą mieć metodę Update, która akceptuje obiekt wpisany jako Action. Fabryka akceptuje typ jako parametr (niezależnie od formy, nazwy, typu, wyliczenia, jeśli jest dostępny) i zwraca poprawne repozytorium. To tyle. Czy istnieje szczególny punkt dezorientacji w kwestii wdrażania fabryki? – Sisyphus
Nie jestem pewien, jak zaimplementować wzorzec fabryczny dla tego, ponieważ IRepository jest generyczny na podstawie każdego obiektu modelu domeny. – mandreko