web-dev-qa-db-ja.com

ASP.NET Core-[FromServices]属性の使用は悪い習慣ですか?

ASP=コアMVCにコントローラーがあります。ユニットテストのビルドをより簡単に開始できるように、コンストラクターで依存関係が注入されたサービスを削減しようとしています。しかし、いくつかのサービスが注入されています1つまたは2つのコントローラーアクションでのみ使用されます。たとえば、いくつかのアクションでは国ILocationService番号を検索してISO Alpha-2を取得する必要があるため、Idを注入しますデータベースを使用する国コード(ID番号1を "CA"にマッピング、2を "US"にマッピングなど)

Asp Coreは[FromServices]属性をサポートしているため、コントローラーコンストラクターにアクションを注入する代わりに、2つのアクションにILocationServiceを直接注入するオプションがあります。これの利点は、すべての単体テストからコントローラーにILocationServiceを常にモック/注入する必要がないことであり、各関数が依存するサービスを単体テストを作成するときに、より明確になります。

明らかな欠点は、コントローラーに依存しているサービスがすべてコンストラクターにグループ化されていないため、完全に明白ではなく、コントローラーがどのサービスに依存しているかが明確になっていることです。

[FromServices]を使用しているのは悪い習慣ですか、それともコードの臭いの強い兆候ですか?

1
Brad

これはコードの匂いや悪いデザインではありません。実際、これが[FromServices]属性が作成された理由です。

FromServicesによるアクションインジェクション

コントローラー内の複数のアクションにサービスが必要ない場合があります。この場合、サービスをパラメーターとして挿入することは意味がありますアクションメソッドに。これは、パラメータを属性[FromServices]...でマークすることによって行われます。

ソース: ASP.NET Coreのコントローラーへの依存性注入 (強調、私のもの)。

3
Greg Burghardt