Hej, krótkie pytanie:
Krótkie pytanie
Gdy używam domyślnego DI w .netcore, jak dostać się do aktywnego IServiceScope, żeby móc ręcznie za pomocą GetService pobrać serwis?
Wyjaśnienie dla dociekliwych po co mi to
Mam solucję, która składa się z 30 projektów. Wśród nich są klienci: WPF, Xamarin, WebApplication(MVC), a także WebAPI.
Generalnie system jest tak pomyślany, żeby można było napisać jak najwięcej klientów pod różne systemy i żeby jak największa ilość kodu mogła być użyta ponownie.
I teraz tak. System zawiera komendy (polecenia) - po prostu klasy, które implementują odpowiedni interfejs.
System zawiera też CommandFactory, który w skrócie wygląda tak:
public class CommandFactory: ICommandFactory
{
IObjectFactory objFactory; //this is my DI container
public CommandFactory(IObjectFactory objFactory)
{
this.objFactory = objFactory;
}
public T CreateCommand<T>() where T: IExecutableCommand
{
return objFactory.Resolve<T>();
}
}
Żeby to działało, potrzebuję czegoś w rodzaju własnego kontenera IOC (tutaj - IObjectFactory). Tak naprawdę dla większości klientów mam po prostu jednego "wrappera" na Autofac.
Jednak przy WebApplication używam standardowego IOC dla .netcore. I tu pojawia się problem. O ile w innych klientach wszystko działa poprawnie, to WebApplication jest zupełnie innym tworem i powoduje problemy.
Do tej pory w tym wrapperze IOC do webApplication, w taki sposób pobierałem serwis zarejestrowany jako scope:
class WebIocContainer: IObjectFactory //to singleton
{
IServiceProvider serviceProvider; //to ustawiam w Startup
public T Resolve<T>()
{
using(var scope = serviceProvider.CreateScope())
{
return scope.ServiceProvider.GetRequiredService<T>();
}
}
}
Oczywiście bardzo szybko okazało się, że to nie tak. W tym momencie tworzę nowy scope, który nie ma żadnych instancji. Więc wszystkie obiekty są tworzone od nowa, tak jakby były zarejestrowane jako Transition. A tego nie chcę.
Więc stąd pytanie - jak pobrać aktualny IServiceScope, żeby móc z niego pobrać serwisy?