0

私は、すべてのデフォルトの依存関係がInitializeとを介して自動的に注入されるアーキテクチャを持っていますOnActionExecuting。これはすべて魅力のように機能します。これは、実行時に(テストではなく)、デフォルトのコントローラーアクティベーターがこれらのメソッドを呼び出して正しい具象オブジェクトを渡すためです。罰金。

Initialize私の問題は、 andOnActionExecutingメソッドに注入できないカスタム依存関係があるときに始まります。

例:

public class MyController
{
    private IEmailSender emailSender = null;
}

さて..emailSender私が何か他のものに設定しない限り、実行時にnullになります。この場合、私は次のようにそれほど大きくないものになってしまいます:

public class MyController
{
    private IEmailSender emailSender = null;
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
         if(this.emailSender == null)
              this.emailSender = new SomeConcreteEmailSender();
    }
}

ぶさいくな。私はこの「nullの場合、インスタンス化する」ことをしたくありません。

注入するためのより洗練された方法は、実行時にのみ呼び出され(テストではなく)、この「if」を実行する必要なしに自動的に注入IEmailSenderする独自の方法を作成することです。ただし、インジェクションが必要なコントローラーごとにカスタムを作成したくありません。ControllerActivatorIEmailSenderControllerActivator

そうは言っても、ASP.NETコントローラーのカスタム依存性注入に関しては何が標準と見なされますか?

4

1 に答える 1

3

そうは言っても、ASP.NETコントローラーのカスタム依存性注入に関しては何が標準と見なされますか?

コンストラクター注入:

public class MyController: Controller
{
    private readonly IEmailSender _emailSender;

    public MyController(IEmailSender emailSender)
    {
        _emailSender = emailSender;
    }

    ... actions using the _emailSender here ...
}

そして、既存の依存性注入フレームワークを使用したくない人のための貧乏人の依存性注入(使用しないでください)と見なされるものは次のとおりです(たとえば、技術的に読み書きのできないモロンがフレームワークを指示する会社で働いているため)使用されるかどうか)またはカスタム依存性リゾルバーを作成するには怠惰すぎる:

public class MyController: Controller
{
    private readonly IEmailSender _emailSender;

    public MyController(): this(new SomeConcreteEmailSender())
    {
    }

    public MyController(IEmailSender emailSender)
    {
        _emailSender = emailSender;
    }

    ... actions using the _emailSender here ...
}
于 2012-09-12T14:55:45.717 に答える