1

FluentValidation を使用してカスタム モデル バリデータ プロバイダーをセットアップしようとしています。ビジネスレイヤーマネージャーをバリデーターのコンストラクターに挿入してビジネスロジックを実行しようとするまで、すべてが機能します。

public class Repository : IRepository
{
    public Repository(IDbConnection)
    {
    }
}

public class Manager : IManager
{
    public Manager(IRepository)
    {
    }
}

public AutofacValidatorFactory : ValidatorFactoryBase
{
}

public MyModelValidator : AbstractValidator<MyModel>
{
    public MyModelValidator(IManager) { }
}

私はすべてを次のように配線します:

builder.Register(c => new SqlConnection(ConfigurationManager.ConnectionStrings["MyCS"].ConnectionString))
               .As<IDbConnection>().InstancePerApiRequest();

builder.RegisterType<Repository>()
               .As<IRepository>()
               .InstancePerDependency();

builder.RegisterType<Manager>()
               .As<IManager>()
               .InstancePerDependency();

builder.RegisterType<ValidatorFactory>()
               .As<IValidatorFactory>()
               .InstancePerLifetimeScope();

        builder.RegisterType<FluentValidation.Mvc.WebApi.FluentValidationModelValidatorProvider>()
               .As<ModelValidatorProvider>()
               .InstancePerLifetimeScope();

        AssemblyScanner.FindValidatorsInAssembly(assembly)
                       .ForEach(
                           result =>
                           Builder.RegisterType(result.ValidatorType).As(result.InterfaceType).InstancePerApiRequest());

最後に、次のように FluentValidator モデル プロバイダーを追加します。

// _validatorProvider is injected as per Autofac config above.    
GlobalConfiguration.Configuration.Services.Add(typeof(ModelValidatorProvider), _validatorProvider);

この問題は、バリデータ ファクトリがバリデータ インスタンスをスピンアップしようとしたときに発生しています。その時点で、次の例外が発生します。

「「AutofacWebRequest」に一致するタグを持つスコープは、インスタンスが要求されたスコープからは見えません。これは通常、HTTP 要求ごとに登録されたコンポーネントが SingleInstance() コンポーネント (または同様のシナリオ) によって要求されていることを示します。 Web 統合の下では、コンテナー自体からではなく、常に DependencyResolver.Current または ILifetimeScopeProvider.RequestLifetime から依存関係を要求します。"

この問題は、Autofac でのマネージャーとリポジトリの構成方法に関係していると思いますが、何が欠けているのかわかりません。

編集: この問題は Web API プロジェクトで発生しています。

4

1 に答える 1

2

あなたのコードをもっと見ないと、あなたの直接の質問に答えることができませんが、この例外が一般的に何を意味するかについては答えることができます

Autofac は、ネストされた有効期間スコープ (つまり、子コンテナー) をサポートしています。メイン コンテナーは、実際には単なるルートの有効期間スコープです。各ライフタイム スコープは、作業の単位と考えることができます。ライフタイム スコープを作成し、そのタスクを実行するために必要なインスタンスを解決してから、ライフタイム スコープを破棄します。その後、有効期間スコープによって作成されたものはすべて破棄されます。

SingleInstance として登録するということは、単一のインスタンスが解決され、ルート スコープによって格納されることを意味します。InstancePerLifetimeScope を使用すると、解決元のスコープごとに各インスタンスが再作成されるため、ルート スコープと子スコープにインスタンスを作成できます。InstancePerMatchingLifetimeScope を使用すると、ツリーの特定のブランチのすべての子コンテナー間で共有されるように型を登録できます。これらの型は決して存在せず、ルート スコープ内の何かからアクセスすることもできません。InstancePerApiRequest は InstancePerMatchingLifetimeScope(“AutofacWebRequest”) と同じです。

アプリケーションでは、各リクエストは子 autofac スコープになります。子スコープ (つまり、IDBConnection) に登録されたものは、同じスコープ (InstancePerLifetimeScope として登録) と親スコープ (SingleInstance として登録) のすべてのものを使用できますが、ここには潜在的な問題があります。親スコープに登録されたもの (ルート コンテナーの SingleInstance など) は、子スコープの InstancePerMatchingLifetimeScope として登録されたものにはアクセスできません。これは、親スコープが子スコープのインスタンスにアクセスできないためです。

これはおそらくあなたが行ったことです – Matching Lifetime スコープに登録された何かに依存する SingleInstance として何かを登録しました。

于 2014-02-28T10:44:49.397 に答える