ASP=コアMVCにコントローラーがあります。ユニットテストのビルドをより簡単に開始できるように、コンストラクターで依存関係が注入されたサービスを削減しようとしています。しかし、いくつかのサービスが注入されています1つまたは2つのコントローラーアクションでのみ使用されます。たとえば、いくつかのアクションでは国ILocationService
番号を検索してISO Alpha-2を取得する必要があるため、Id
を注入しますデータベースを使用する国コード(ID番号1を "CA"にマッピング、2を "US"にマッピングなど)
Asp Coreは[FromServices]
属性をサポートしているため、コントローラーコンストラクターにアクションを注入する代わりに、2つのアクションにILocationService
を直接注入するオプションがあります。これの利点は、すべての単体テストからコントローラーにILocationService
を常にモック/注入する必要がないことであり、各関数が依存するサービスを単体テストを作成するときに、より明確になります。
明らかな欠点は、コントローラーに依存しているサービスがすべてコンストラクターにグループ化されていないため、完全に明白ではなく、コントローラーがどのサービスに依存しているかが明確になっていることです。
[FromServices]
を使用しているのは悪い習慣ですか、それともコードの臭いの強い兆候ですか?
これはコードの匂いや悪いデザインではありません。実際、これが[FromServices]
属性が作成された理由です。
FromServicesによるアクションインジェクション
コントローラー内の複数のアクションにサービスが必要ない場合があります。この場合、サービスをパラメーターとして挿入することは意味がありますアクションメソッドに。これは、パラメータを属性
[FromServices]
...でマークすることによって行われます。
ソース: ASP.NET Coreのコントローラーへの依存性注入 (強調、私のもの)。