1

主な質問: 他のレイヤーで Ninject.MVC3 で構成された依存関係を見つけるにはどうすればよいですか?

バックグラウンド:

ASP.NET MVC4 プロジェクトの 1 つで Ninject.MVC3 を使用しています。

以前に ServiceLocator を使用したことがありますが、Ninject は初めてです。Ninject の設定と構成は、新しい拡張機能により非常に簡単です。

新しい Ninject.MVC3 Nuget パッケージでは、" NinjectWebCommon" クラスを Web プロジェクトの App_Start フォルダーに追加します。ここで、すべての依存関係を構成します。このクラスは静的であり、void を返す Start および Stop 静的メソッド以外は外部に公開しません。

それを使用するには、その " RegisterServices" メソッドで依存関係を構成できます。

    private static void RegisterServices(IKernel kernel)
    { 
        kernel.Bind<IDataContext>().To<MyDataContext>().WithConstructorArgument("connectionString", "name=MyDataContext");

        kernel.Bind<IRoleService>()
        .To<RoleService>()
        .WithConstructorArgument("dbContext", context => context.Kernel.Get<IDataContext>());
    }

ビジネス層では、構成されたサービスのいずれかを使用できます。

public class RoleService : IRoleService
{
    private readonly IDataContext _dbContext;

    public RoleService(IDataContext dbContext)
    {
        _dbContext = dbContext;
    }
}

ここで、ILogger という新しい依存関係をこのクラスに追加するとしますRoleService。私がそれをしなければならない現在の方法は次のようなものです:

public class RoleService : IRoleService
{
    private readonly IDataContext _dbContext;
    private ILogger _logger;

    public RoleService(IDataContext dbContext, ILogger logger)
    {
        _dbContext = dbContext;
        _logger = logger;
    }
}

これが、モジュールが依存関係を発見できるようにする唯一の (または理想的または標準的な) 方法なのだろうか?

私はこれServiceLocatorをしただろう:

    public class RoleService : IRoleService
    {
        private readonly IDataContext _dbContext;
        private readonly Lazy<ILogger> _logger;        

        public RoleService(IDataContext dbContext)
        {
            _dbContext = dbContext;
            _logger = Locator.Current.GetInstanceLazy<ILogger>();
        }
    }

私は周りを見回してみましたが、ほとんどの場合、Ninject のコンストラクターベースのインジェクションが見つかりました。

コンストラクター ベースのアプローチの問題は、依存関係を追加すると、コンストラクターのパラメーター リストが大きくなることです。SRPが登場することは知っています:)しかし、依存関係が3つ未満であることは正常です。各クラスには DbContext が必要です。各クラスにはロガーが必要です。別の監査機能がある場合は、それが 3 番目になります。

プロパティベースのインジェクションとの取引は何ですか。試してみたところ、次のようなプロパティを追加しました:

    [Inject]
    public IRoleWrapper RoleWrapper { get; set; }

ビジネス層に存在する RoleService クラスで。プロパティは初期化されておらず、null に設定されています。Ninject を初期化するにはどうすればよいですか。ninject の初期化は MVC Web プロジェクトで行われることに注意してください。

私の質問を要約すると、次のとおりです。

  1. Ninject MVC3パッケージに関して、これら2つのコンストラクターとプロパティの注入のうち、より良いアプローチは何ですか?

  2. ServiceLocator を使用して行うことができるように、ビジネス レイヤー クラスの依存関係を検出する別の方法はありますか?

  3. 上記の場合、プロパティ注入はどのように機能するはずですか?

前もって感謝します。

4

1 に答える 1