Cześć, tworzę sobie system, który działa na zasadzie engine <-> klient (interfejs użytkownika).
Generalnie chodzi o to, żeby klientów mogło być wielu na różne platformy, więc większość logiki powinna być obsługiwana przez engine. No takie to trochę MVC, ale nie w 100% klasyczne.
I teraz naszła mnie taka myśl. Mam sobie interfejs do widoku: IMyView
.
W pewnym momencie framework musi utworzyć taki widok (wykorzystuje do tego IoC):
IMyView view = objFactory.Resolve<IMyView>();
Okazuje się jednak, że jeden z widoków powinien mieć kilka prostych parametrów w konstruktorze, coś w ten deseń:
public MyView(bool bValue, int iValue)
{
}
W zależności od tych parametrów, na widoku jedna kontrolka powinna być aktywna bądź nie. Więc teraz można to wykonać na dwa sposoby. Albo wymuszając niejawnie postać konstruktora i zrobić coś w stylu:
IMyView view = objFactory.ResolveWithParameters(true, 1);
albo przenosząc część inicjalizacji do metody przedstawionej w interfejsie. I wtedy wyglądałoby to tak:
public interface IMyView: IView
{
void LateConstructor(bool bValue, int iValue);
}
a wywołanie:
IMyView view = objFactory.Resolve<IMyView>();
view.LateConstructor(true, 1);
Bardziej naturalne wydaje mi się podejście z dodatkową metodą w interfejsie. Minusem jest to, że framework przy każdorazowym tworzeniu takiego widoku musi pamiętać o tym, żeby wywołać tą metodę (można zrobić to mądrze oczywiście z użyciem jakiegoś managera widoków i wtedy ten problem niejako odpada, jednak trzeba tworzyć i używać managera/fabrykę widoków, który nie do końca wydaje się potrzebny, skoro mamy objFactory).
Z drugiej strony wymuszenie odpowiedniego konstruktora w klasie widoku wydaje się być wygodniejsze, ale mam tu wątpliwości od strony architektonicznej. Co o tym sądzicie?
Co do pytań w stylu: "A nie możesz tego zrobić za pomocą objFactory, który już masz?". Odpowiadam: nie. Bo objFactory to abstrakcja od strony engine. Tak naprawdę klient implementuje objectFactory, dzięki czemu np. w Winforms mogę wykorzystać AutoFAC, a na Androidzie coś zupełnie innego.