我是 ASP.NET MVC 4 的新手。为了使用依赖注入框架,我在 ASP.NET MVC 4 项目中使用了自定义依赖解析器。
ASP.NET MVC 4 中依赖解析器的作用是什么?
我是 ASP.NET MVC 4 的新手。为了使用依赖注入框架,我在 ASP.NET MVC 4 项目中使用了自定义依赖解析器。
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 也很容易,但这超出了问题的范围。