Autofac - wie man Func for ISomething von Singleton auflöst, wo ISomething InstancePerHttpRequest ist

Ich versuche, mithilfe von Autofac Abhängigkeiten in FluentValidation in einer MVC 4-App einzufügen. Ich glaube, ich habe die Strategie ausgearbeitet, aber ich bin nicht mehr in der Lage, meine Einzelanforderung ISomething von einem Singleton aus zu lösen.

Hier ist das Szenario: Ich habe einen Validator, der vom AbstractValidator von FluentValidation abgeleitet ist. Ich habe gelesen, dass FluentValidation-Validatoren als Singletons die beste Leistung erbringen, daher erwartet mein Konstruktor eine Func und speichert diese Factory zur späteren Verwendung. Wenn der Validator verwendet wird, sollte er die gespeicherte Factory nach einem IDataStore fragen, die für diese Anforderung erstellte Instanz abrufen und verwenden. Das ist die Theorie. Ich möchte das würdigenhttps://github.com/robdmoore/UnobtrusiveMVCTechniques, was mir geholfen hat, mich für diese Lösung zu entscheiden. Hier ist der Validator ...

public class SiteAdminViewModelValidator : AbstractValidator<SiteAdminViewModel> {
    private readonly Func<IDataStore> _dbFactory;

    public SiteAdminViewModelValidator(Func<IDataStore> dbFactory) {
        _dbFactory = dbFactory;

        RuleFor(model => model.SiteCode).Length(1, 40).Must(BeSpecial);
    }

    public bool BeSpecial(string siteCode) {
        var db = _dbFactory();
        List<Stuff> stuffs = db.All<Stuff>().ToList();

        return true;
    }
}

Wenn mich jemand auf ein funktionierendes Beispiel für das hinweisen kann, was ich erreichen möchte, wäre das großartig, aber ich würde auch gerne die Lösung für dieses spezielle Stück Autofac-Tricksyness kennen.

Hier ist meine Validator-Registrierung ...

public class FluentValidatorModule : Module {
    protected override void Load(ContainerBuilder builder) {
        base.Load(builder);
        builder.RegisterType<AutofacValidatorFactory>().As<IValidatorFactory>().SingleInstance();

    var validators = AssemblyScanner.FindValidatorsInAssembly(System.Reflection.Assembly.GetExecutingAssembly());
    validators.ToList().ForEach(v => builder.RegisterType(v.ValidatorType).As(v.InterfaceType).SingleInstance());
    }
}

Hier ist meine Registrierung für die IDataStore-Fabrik ...

builder.RegisterType<SuperDB>().As<IDataStore>().InstancePerHttpRequest();
builder.Register<Func<IDataStore>>(c => {
                                       var context = c.Resolve<IComponentContext>();
                                       return context.Resolve<IDataStore>;
                                   });

Hier ist der Fehler, den ich bekomme, wenn mein Prüfer nach einem IDataStore in der Zeile fragt - var db = _dbFactory ();

In dem Bereich, in dem die Instanz angefordert wurde, ist kein Bereich mit einem Tag sichtbar, der mit "AutofacWebRequest" übereinstimmt. Dies zeigt im Allgemeinen an, dass eine als Per-HTTP-Anforderung registrierte Komponente von einer SingleInstance () - Komponente angefordert wird (oder einem ähnlichen Szenario). Bei der Webintegration fordern Sie Abhängigkeiten immer vom DependencyResolver.Current oder ILifetimeScopeProvider.RequestLifetime an, niemals vom Container selbst .

... genau das habe ich bekommen, als ich es ausprobiert habe, bevor ich meine eigene Factory-Registrierung geschrieben habe - die Func-Registrierung. Nachdem ich verschiedene Antworten auf ähnliche Fragen gelesen hatte, sah es so aus, als ob das, was ich oben hatte, funktionieren sollte, da ich dachte, ich würde jetzt die Funktion auflösen, um den aktuellen Auflöser zu erhalten.

Jede Hilfe wird sehr geschätzt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage