Autofac を使用して、MVC 4 アプリの FluentValidation に依存関係を挿入しようとしています。戦略はうまくいったと思いますが、リクエストごとの ISomething をシングルトンから解決することに行き詰まっています。
シナリオは次のとおりです。FluentValidation の AbstractValidator から派生したバリデーターがあります。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() コンポーネント (または同様のシナリオ) によってリクエストされていることを示します。Web 統合の下では、コンテナー自体からではなく、常に DependencyResolver.Current または ILifetimeScopeProvider.RequestLifetime から依存関係をリクエストします。 .
...これは、自分の Factory 登録 (Func 登録) を作成する前に試してみたときに得られたものとまったく同じです。同様の質問に対するさまざまな回答を読んだところ、現在のリゾルバーを取得するために Func を解決していると思ったので、上記のものがうまくいくように見えました。
どんな助けでも大歓迎です。