Ninject, warunkowa konfiguracja

0

Siemka. Zaćmienie mam, pomóżcie.

Mam aplikację asp.net mvc dla 2 klientów i w Ninjecie ustawiam sobie binding interefejsów.
Klient 1 ma mieć implementację Klasa1 a Klient2 powinien mieć implementacje Klasa2.

Gdzie, jak, czego użyć do warunkowej konfiguracji? To nie musi być jakoś specjalnie zabezpieczone.

Na razie mam w Settings kod klienta i wg niego w if-ach binduję odpowiednie klasy ale jakoś mi się to nie podoba.

0

Możesz zdefiniować Conditional compilation symbols jako nazwa klienta i zastosować kompilację warunkową np:

#if Klient1
	// tutaj np. definicja konstruktora z wstrzykiwaniem zależności dla Klienta 1
#endif
#if Klient2
	// to samo ale dla Klienta 2
#endif

Teraz wstawiając jako Conditional compilation symbols odpowiednio Klient1 albo Klient2 będzie Ci się w IDE z automatu zaciemniał kod, który nie zostanie wkompilowany w binarkę.

Frazy wpisuje się wewnątrz własności projektu:
screenshot-20180706140502.png

0

Podane rozwiązania są OK, ale ja chciałbym mieć taki sam build dla oby klientów tylko różnice w konfiguracji bo chyba łatwiej będzie to potem wdrażać. Robię build, publish na 2 serwery i potem tylko ewentualne ustawienie jakichś parametrów, żeby Ninject zbindował odpowiednie imlementacje.
Prawie cała aplikacja jest taka dla klientów tylko są drobne różnice w implementacjach niektórych interfejsów.

0
jacek.placek napisał(a):

Na razie mam w Settings kod klienta i wg niego w if-ach binduję odpowiednie klasy ale jakoś mi się to nie podoba.

Ale co Ci się nie podoba? Bo raczej ciężko wymyślić coś równie łatwego, stabilnego i skalowalnego.

0

OK. Dałem trochę ciała bo powinienem napisać na czym właściwy problem polega.

Mam aplikację (legacy), która jest rozwijana dla różnych klientów i chodzi mi o maksymalne uproszczenie i zautomatyzowanie deploymentu. Na razie nie chcę używać jakichś pełnych systemów CI bo na tym etapie to chyba nie jest tego warte. Wystarczy mi jak będę mógł standardowym Publishem z VS wysłać wszystko co potrzeba na serwery klientów. Tzn po jednym publishu na klienta.

No i teraz. W aplikacji są różnice, o których pisałem wcześniej a Publish wyśle mi standardowy web.config dlatego nie chciałbym w nim trzymać danych konfiguracyjnych dla Ninjecta (i kilku innych parametrów).
Próbuję teraz wrzucić jakiegoś XML-a z konfigiem do App_Data bo publish ma opcję wyłączenia publikacji tego folderu więc publikowanie kolejnych aktualizacji nie powinno zmienić danych konfiguracyjnych w tym folderze.
Tylko teraz pytanie gdzie odczytywać te dane. W Gobal.asax w Application_Start() bez sensu bo (chyba) to wymagałoby restartu aplikacji a ten jest raczej niekonieczny.
W jakimś BaseController? Gdzie indziej?

Próbowałem kiedyś Squirrel-a (w winformsowych) ale się sypało na ich własnych tutorialach.

Wspominałem, że web to nie moja bajka i stad te rozterki :/

0
jacek.placek napisał(a):

No i teraz. W aplikacji są różnice, o których pisałem wcześniej a Publish wyśle mi standardowy web.config dlatego nie chciałbym w nim trzymać danych konfiguracyjnych dla Ninjecta (i kilku innych parametrów).

O ile wiem, to Publish pozwala na transformację web.config... https://msdn.microsoft.com/en-us/library/dd465318%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396

Tylko teraz pytanie gdzie odczytywać te dane. W Gobal.asax w Application_Start() bez sensu bo (chyba) to wymagałoby restartu aplikacji a ten jest raczej niekonieczny.

I tak musisz zrestartować kontener IoC, prawda? A to się zazwyczaj robi przy starcie aplikacji, robienie tego podczas jej pracy może dać dziwne efekty.

0

Dzięki @somekind. Faktycznie to powinno załatwić temat. do tej pory w desktopowych nie potrzebowałem bo mi instalatory cośtam zapewniały.

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