FluentValidationバリデータがSimple Injectorで動作するのにはいくつか問題があります。FluentValidation Validatorsとバリデーターが配列として注入されるシンプルインジェクタ
public CommandHandlerValidationDecorator(
IRequestHandler<TRequest, TRepsonse> innerHandler,
IValidator<TRequest>[] validators)
{
_decoratedHandler = innerHandler;
_validators = validators;
}
問題は第二のパラメータ、IValidator<TRequest>[] validators
である:
は私がのコンストラクタでデコレータを持っています。私はなっていたエラーメッセージに導かれ
次のように、私は私の設定をした:
container.Register(typeof(FluentValidation.IValidator<>), new[] { assembly });
container.RegisterCollection(typeof(FluentValidation.IValidator<>), new[] { assembly });
container.Register(typeof(IRequestHandler<,>),new [] { assembly });
container.RegisterDecorator(typeof(IRequestHandler<,>),
typeof(CommandHandlerValidationDecorator<,>));
これは私がウェブあたりの要求に寿命のスコープを変更アップまで、うまく働いた:
container.Register(typeof(FluentValidation.IValidator<>), new[] { assembly },
Lifestyle.Scoped);
container.RegisterCollection(typeof(FluentValidation.IValidator<>), new[] { assembly });
container.Register(typeof(IRequestHandler<,>),new [] { assembly }, Lifestyle.Scoped);
container.RegisterDecorator(typeof(IRequestHandler<,>),
typeof(CommandHandlerValidationDecorator<,>), Lifestyle.Scoped);
RegisterCollectionをWebリクエストごとにスコープできないように見えますが、ライフスタイルの不一致により例外がスローされるため、問題になります:
追加情報:ライフスタイルの不一致が発生しました。 CommandHandlerValidationDecorator(Web Request)はIValidator [](Transient)に依存します。ライフスタイルの不一致は、アプリケーションの並行性のバグを引き起こす可能性があります。この問題とそれを解決する方法については、https://simpleinjector.org/dialmを参照してください。
おそらく私は悪い練習であることを強制しようとしていますか?ドキュメントのhereに記載されているあなたが見ている
コンストラクタの引数を 'Enumable>'に変更しても問題ありません。 –
Steven
@スティーブンスピーディで結果の高い回答をありがとう! – onefootswill