Autofac - как разрешить Func для ISomething из Singleton, где ISomething - InstancePerHttpRequest

Я пытаюсь использовать Autofac для внедрения зависимостей в FluentValidation в приложении MVC 4. Я думаю, что у меня есть разработанная стратегия, но я застреваю с разрешением своего запроса на что-то из одного экземпляра.

Вот сценарий: у меня есть валидатор, который является производным от AbstractValidator от FluentValidation. Я читал, что валидаторы FluentValidation работают лучше всего как синглтоны, поэтому мой конструктор ожидает Func и сохраняет эту Factory для дальнейшего использования. Когда используется валидатор, он должен запросить у хранимой фабрики IDataStore, получить экземпляр, созданный для этого запроса, и использовать его. Это теория. Я хочу отдать должноеhttps://github.com/robdmoore/UnobtrusiveMVCTechniques, который помог мне остановиться на этом решении. Вот валидатор ...

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

Если кто-то может указать мне рабочий пример того, чего я пытаюсь достичь, это было бы замечательно, но я также хотел бы узнать решение этой конкретной проблемы хитрости Autofac.

Вот моя регистрация валидатора ...

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

Вот моя регистрация на фабрику IDataStore ...

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

Вот ошибка, которую я получаю, когда мой валидатор запрашивает IDataStore в строке - var db = _dbFactory ();

Из области, в которой был запрошен экземпляр, не видна область с тегом, совпадающим с «AutofacWebRequest». Как правило, это указывает на то, что компонент, зарегистрированный как запрос на HTTP, запрашивается компонентом SingleInstance () (или аналогичным сценарием). При веб-интеграции всегда запрашивают зависимости из DependencyResolver.Current или ILifetimeScopeProvider.RequestLifetime, а не из самого контейнера. ,

... это именно то, что я получил, когда попробовал до написания своей собственной регистрации на Фабрике - регистрации Func. Прочитав различные ответы на похожие вопросы, я понял, что то, что у меня есть выше, должно сработать, потому что я думал, что теперь разрешаю Func для получения текущего преобразователя.

Любая помощь будет оценена.

Ответы на вопрос(2)

Ваш ответ на вопрос