コンストラクタにおけるコンテキストクラスの依存性注入

asp.net-core-mvc c# dependency-injection entity-framework-core

質問

私はApplicationContextを使用するサービスを持っていApplicationContext 。ですから、私はアプリケーションが私にコンテキストを与えるように依存性注入を使いたいと思います。だから私は建設に入れた

Private _context;

// Constructor
public Service(ApplicationContext context) {
    _context = context
}

問題は、このサービスを初期化するときにコンテキストを渡す必要があるためです。それは本当に依存関係の注入ではありませんか?

コンテクストをコンストラクタのパラメータに入れずに注入する方法はありますか?

****** EDIT *****

私が最初に十分な情報を与えなかったことは残念です。それをもっとうまく説明しよう。私はただ今サービスを呼び出すサービスを持っています。リクエスト内のヘッダ変数を読み込み、それらの値のxml baseを返します。私は、ヘッダ変数の値が異なる可能性があるため、コントローラの異なるメソッドごとにインスタンスを作成します。コンテクストをコントローラーの代わりにサービスに注入したいので、これを言うことができます:

Service service = new Service(Request);

これの代わりに:

Service service = new Service(Request, Context);

その理由は、コントローラがそれについて何も知らなくてもよいコンテキストですべての作業をしているからです。私が持っているコードは動作しますが、もし私が説明したようにこれを動作させることができれば素晴らしいでしょう。

私たちはまだプロパティから[FromServices]することができます。それは完璧な解決策になります。残念ながらそれは取り去られました。これは、サービスまたはコントローラのコンストラクタにコンテキストを注入するだけです。どのような場合でも、私はまだサービスへの引数としてコンテキストを渡す必要があります。

コンテキストをサービスコンストラクタに挿入し、作成時に引数として渡す必要がないようにする方法はありますか?

私が検討して喜んでより洗練されたソリューションがあるかもしれません。

受け入れられた回答

それはコンストラクタに対する依存性注入です。 DIでは、サービスを直接初期化しないでください。 Startup.csにサービスApplicationContextを登録する必要があります。

サービスが必要なときは、コンストラクタを介してコントローラーに挿入し、DIチェーンは自動的にApplicationContextのインスタンスをサービスに挿入します。

もちろん、コントローラ内のメソッドごとにサービスを必要としない場合は、@Olegが書いたメソッドに初期化することができます。


人気のある回答

あなたのコントローラには例えば1つのメソッドしかないので、 ApplicationContextを保存するために別のコンストラクタを導入することは利点がありません。コンテキストはすでにHttpContext内部に保持されており、コントローラアクションの追加パラメータとして[FromServices]属性を使用できます。 ドキュメントを参照してください。例えば

[Route("api/[controller]")]
public class MyController : Controller
{
    [HttpGet]
    public async IEnumerable<object> Get([FromServices] ApplicationContext context,
                                         MyType myMainParam)
    {
        ...
    }
}

RC1では依存関係注入から情報を取得するために[FromServices]でプロパティを定義することができますが、RC2はそれ以上許可しません( アナウンスを参照)。 答えには両方のスタイルの例があります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ