Mam sobie solucję, która zawiera między innymi dwa projekty.
- Backend - logika biznesowa, context DB (nazwijmy go DBContextBE) dziedziczący po DbContext z którego korzysta logika biznesowa.
- API - tutaj znajduje się drugi context DB (nazwijmy go DBContextAPI) dziedziczący po DbContext z którego korzystają niektóre metody w tym projekcie.
Natomiast po stronie backendu (projekt punkt 1) jest adapter EF zawierający metody zapisu, aktualizacji czy tworzenia obiektów modeli bazy danych.
Po stronie API część metod z kontrolera odwołuje się do lokalnej logiki i DBContextAPI, a część metod do logiki z backendu (punkt 1) gdzie potrzebny jest DBContextBE.
I tutaj mam problem. Jak zarejestrować po stronie API dany context DB w zależności od tego, która logika jest w danym momencie używana?
Np. odpalam metodę z kontrolera API, która korzysta z logiki na backendzie gdzie operujemy na DBContextBE i gdy jest używana metoda z klas backendowych to rejestruję DBContextBE gdyż w konstruktorze adaptera EF oczekiwany jest obiekt klasy DBContext.
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IDbContextAdapter>()
.ImplementedBy<EfDbContextAdapter>()
.LifestyleTransient());
//Odpalam metodę wykorzystującą logikę z backendu to do EfDbContextAdapter potrzebuję wstrzyknąć DBContextBE
container.Register(Component.For<DbContext>()
.ImplementedBy<DBContextBE>()
.LifestyleTransient());
//Odpalam metodę wykorzystującą logikę z API to do EfDbContextAdapter potrzebuję wstrzyknąć DBContextAPI
container.Register(Component.For<DbContext>()
.ImplementedBy<DBContextAPI>()
.LifestyleTransient());
}
Jak to uwarunkować? A w zasadzie jak poznać na etapie rejestracji, że w danym momencie jest uruchamiana dana metoda?