Skip to content

投稿

FromService 属性をいつ使用するか

2019年11月20日 • 5 分で読める

FromService 属性をいつ使用するか

最近、.Net Core の最初のバージョンから存在する [FromServices] 属性を発見しました。

[FromServices] 属性は、Asp.Net Core コントローラーでメソッドレベルの依存性注入を可能にします。

以下は例です:

public class UserController : Controller
{
    private readonly IApplicationSettings _applicationSettings;

    public UserController(IApplicationSettings applicationSettings)
    {
        _applicationSettings = applicationSettings;
    }

    public IActionResult Get([FromService]IUserRepository userRepository, int userId)
    {
        //Do magic
    }
}

コンストラクタ注入よりもメソッド注入を使用する理由は何でしょうか?一般的な説明は、メソッドが依存関係を必要とし、他の場所では使用されていない場合、[FromService] 属性を使用する候補となるということです。

StackOverflowSteven は、[FromService] 属性の使用に対する 回答 を投稿しました:

私にとって、このタイプのメソッド注入をコントローラーアクションに使用することは悪い考えです。理由は以下の通りです:

– このような [FromServices] 属性は簡単に忘れられる可能性があり、アクションが呼び出されるまで気付きません(アプリケーション起動時に気付くことができず、アプリケーションの構成を検証できます)

– パフォーマンス上の理由からコンストラクタ注入から移行する必要があるということは、注入されたコンポーネントが作成するには重すぎることを明確に示しています。一方、注入コンストラクタはシンプルであるべきであり、コンポーネント作成は非常に軽量であるべきです。

– コンストラクタが大きくなるのを防ぐためにコンストラクタ注入から移行する必要があるということは、クラスに依存関係が多すぎて複雑になっていることを示しています。言い換えれば、多くの依存関係を持つことは、クラスが 単一責任の原則 に違反していることを示しています。コントローラーアクションを異なるクラスに簡単に分割できるという事実は、そのようなコントローラーが非常に凝集度が低く、したがって SRP 違反の兆候であることを証明しています。

したがって、メソッド注入を使用して根本的な問題を隠すのではなく、コンストラクタ注入を唯一の注入パターンとして使用し、コントローラーをより小さくすることをお勧めします。ただし、これはルーティングスキームがクラス構造と異なる可能性があることを意味しますが、これは完全に問題なく、ASP.NET Core によって完全にサポートされています。

テスト可能性の観点からは、ちなみに、時々必要のない依存関係があるかどうかは本当に重要ではありません。この問題を解決する 効果的なテストパターン があります。

Steven に同意します。クラスが多くの依存関係を構築しているためにコントローラーから依存関係をメソッドに移動する必要がある場合、コントローラーを分割する時が来ています。ほぼ確実に SRP に違反しています。

メソッド注入で見られる唯一のユースケースは、コントローラー構築時に準備ができていない依存関係の遅延バインディングです。それ以外の場合は、コンストラクタ注入を使用する方が良いです。

これを言う理由は、コンストラクタ注入では、クラスは構築時に依存関係が利用可能かどうかを知っています。メソッド注入では、これは当てはまりません。メソッドが呼び出されるまで、依存関係が利用可能かどうかは不明です。

Author: Chuck Conway is an AI Engineer with nearly 30 years of software engineering experience. He builds practical AI systems—content pipelines, infrastructure agents, and tools that solve real problems—and shares what he’s learning along the way. Connect with him on social media: X (@chuckconway) or visit him on YouTube and on SubStack.

著者: Chuck Conwayは、ソフトウェアエンジニアリングの経験が30年近くあるAIエンジニアです。彼は実用的なAIシステム(コンテンツパイプライン、インフラストラクチャエージェント、実際の問題を解決するツール)を構築し、学んだことを共有しています。ソーシャルメディアで彼とつながってください: X (@chuckconway) または YouTubeSubStack で彼を訪問してください。

↑ トップに戻る

こちらもおすすめ