Ich verwende Simple Injector. Ich habe einen Hintergrundprozessor, der DI von Anfang an verwendet. Es werden Jobs zum Ausführen abgeholt und ausgeführt. Jeder Job muss jedoch in seinem eigenen Bereich ausgeführt werden, damit ich einige kontextabhängige Abhängigkeiten überschreiben kann. Der Job muss beispielsweise in einem bestimmten Sicherheitskontext (demjenigen, aus dem er erstellt wurde) ausgeführt werden. Daher muss ich einen neuen Bereich starten und die ISecurityContext
Injektion überschreiben, damit der Job ordnungsgemäß gesichert wird.Ordnungsgemäße Methode zum Überschreiben von Abhängigkeiten innerhalb eines Bereichs
Um dies zu erreichen, erstellte ich einen neuen Container (mit der richtigen) und starten einen Bereich, dann den Job ausgeführt, aber ich bin mir nicht sicher, ob dies eine geeignete Sache zu tun ist.
RunJob
private readonly Func<ISecurityContext, Container> _containerFactory;
internal async Task RunJob(BackgroundJob job) {
var parameters = job.GetParameters();
var securityContext = parameters.SecurityContext;
using (var container = _containerFactory(securityContext))
using (AsyncScopedLifestyle.BeginScope(container)) {
// Run the job within this scope.
}
}
DI Bits
container.RegisterSingleton<Func<ISecurityContext, Container>>(() => securityContext => {
var c = new Container();
RegisterDependencies(c);
c.Options.AllowOverridingRegistrations = true;
c.Register<ISecurityContext>(() => securityContext, Lifestyle.Scoped);
return c;
});
Es fühlt sich nicht richtig für mich, aber ich bin mir nicht sicher, was die richtige Lösung ist.
Ausgezeichnet, vielen Dank. Dies ist definitiv eine große Verbesserung. –