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 для получения текущего преобразователя.
Любая помощь будет оценена.