主な質問: 他のレイヤーで 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 プロジェクトで行われることに注意してください。
私の質問を要約すると、次のとおりです。
Ninject MVC3パッケージに関して、これら2つのコンストラクターとプロパティの注入のうち、より良いアプローチは何ですか?
ServiceLocator を使用して行うことができるように、ビジネス レイヤー クラスの依存関係を検出する別の方法はありますか?
上記の場合、プロパティ注入はどのように機能するはずですか?
前もって感謝します。