ASP.NET MVC 4を初めて使用します。依存性注入フレームワークを使用するために、ASP.NET MVC4プロジェクトでカスタム依存性リゾルバーを使用しました。
ASP.NET MVC 4での依存関係リゾルバーの役割は何ですか?
これにより、依存性注入の実装から抽象化することができます。後でUnityからWindsorに切り替えることにした場合、多くのコードを書き直すことなく、はるかに簡単に切り替えることができます。
これは、このコードを使用してインスタンスを解決できることを意味します
DependencyResolver.Current.GetService<IMyController>();
Ninjectを使用して別のアプローチを使用します
ここで、カスタムコントローラーファクトリクラス(DefaultControllerFactoryから派生したクラス)を作成します。私の目標は、MVCがコントローラーオブジェクトを作成しようとするときにコントローラーファクトリを使用するようにすることです。
public class NinjectControllerFactory : DefaultControllerFactory
{
#region Member Variables
private IKernel ninjectKernel = null;
#endregion
public NinjectControllerFactory(IKernel kernel)
{
this.ninjectKernel = kernel;
AddBindings();
}
private void AddBindings()
{
//BO
ninjectKernel.Bind<IAuthenticationBO>().To<AuthenticationBO>();
//DAO
ninjectKernel.Bind<ISharedDAO>().To<SharedDAO>();
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
}
}
カスタムコントローラーファクトリを使用するようにMVCを作成します。 Application_Start()のGlobal.asax内
public class MvcApplication : System.Web.HttpApplication
{
private IKernel kernel = new StandardKernel();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//register a cutom controller factory
ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(kernel));
}
}
したがって、MVCがコントローラーオブジェクトを作成するときは、カスタムコントローラーファクトリを使用し、ご覧のとおり、Ninjectを使用してすべての依存関係を解決します。
例えば
public class MainController : Controller
{
#region Member Variables
private IAuthenticationBO authentication = null;
#endregion
public MainController(IAuthenticationBO authentication)
{
this.authentication = authentication;
}
}
Ninjectは、IAuthenticationBO(この場合はAuthenticationBO)の実装を注入し、それを使用できます。また、モックとTDDの使用は非常に簡単ですが、質問の範囲を超えています。