Autofac - jak rozwiązać Func dla ISomething z Singleton, gdzie ISomething to InstancePerHttpRequest

Próbuję użyć Autofac do wstrzykiwania zależności do FluentValidation w aplikacji MVC 4. Myślę, że udało mi się wypracować strategię, ale utknąłem w rozwiązaniu mojego pojedynczego żądania z singletonu.

Oto scenariusz: Mam walidator pochodzący z AbstractValidator FluentValidation. Czytałem, że walidatory FluentValidation działają najlepiej jako singletony, więc mój konstruktor spodziewa się Funca i przechowuje tę fabrykę do późniejszego wykorzystania. Kiedy walidator jest używany, powinien zapytać przechowywaną fabrykę o IDataStore, uzyskać instancję utworzoną dla tego żądania i użyć go. Taka jest teoria. Chcę się przyznaćhttps://github.com/robdmoore/UnobtrusiveMVCTechniques, co pomogło mi rozstrzygnąć to rozwiązanie. Oto walidator ...

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;
    }
}

Jeśli ktoś może wskazać mi działający przykład tego, co próbuję osiągnąć, byłoby wspaniale, ale chciałbym również poznać rozwiązanie tego konkretnego fragmentu sztuczki Autofaca.

Oto moja rejestracja walidatora ...

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());
    }
}

Oto moja rejestracja w fabryce IDataStore ...

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

Oto błąd, który otrzymuję, gdy mój walidator prosi o IDataStore w wierszu - var db = _dbFactory ();

Brak zakresu z tagiem pasującym do „AutofacWebRequest” jest widoczny z zakresu, w którym wystąpiono o wystąpienie. Zwykle oznacza to, że komponent zarejestrowany jako żądanie na HTTP jest żądany przez komponent SingleInstance () (lub podobny scenariusz). W ramach integracji internetowej zawsze żądaj zależności z DependencyResolver.Current lub ILifetimeScopeProvider.RequestLifetime, nigdy z samego kontenera .

... to jest dokładnie to, co dostałem, kiedy próbowałem tego przed napisaniem własnej rejestracji w fabryce - rejestracji Func. Czytając różne odpowiedzi na podobne pytania, wyglądało na to, że to, co mam powyżej, powinno działać, ponieważ myślałem, że teraz rozwiązuję Func, aby uzyskać aktualny przelicznik.

Każda pomoc zostanie bardzo doceniona.

questionAnswers(2)

yourAnswerToTheQuestion