原文链接:http://code.google.com/p/autofac/wiki/Mvc3Integration
MVC整合的Autofac已经更新以对Asp.Net Mvc 3的新加特征提供更好的依赖注入支持。您可以通过Brad Wilson的详述
blog post series
阅读更多关于Asp.Net Mvc 3的新特征。
Get Started with NuGet
在Asp.Net Mvc 3中使用Autofac的最好方式就是通过
NuGet包来安装Autofac.Mvc3.
安装Autofac.Mvc3包之后,实现控制器Controller依赖注入所需要做的所有事情就是在Global.asax文件中的应用程序启动的方法中设置DependencyResolver:
protected void Application_Start()
{
var builder = new ContainerBuilder();
builder.RegisterController(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new Autofac
DependencyResolver(container)
);
// Other MVC setup...
}
New ASP.NET MVC 3 Projects
需要的引用
添加下列程序集的一个引用:
- Autofac.dll
- Autoface.Intergration.Mvc.dll
您将需要添加Autofac和Autofac.Intergration命名空间。
注册控制器
在Global.asax.cs中的Application_Start方法内部注册所有的控制器和它们的依赖。
您可以手工做如下操作:
var builder = new ContainerBuilder();
builder.RegisterType<HomeController>().InstancePerRequest();
...或者您可以使用一个已提供的扩展方法来一次性注册一个程序集中所有的控制器:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
应注意ASP.NET MVC请求控制器是通过控制器类的具体类型,所以注册它们As<IController>()是不正确的。如果您手工注册控制器并且选择特定的生命周期的话,您必须注册它们为InstancePerDependency()或者InstancePerHttpRequest()。如果您试图在对此请求中重复利用一个控制器实力的话Asp.Net将抛出一个异常。
Dependency Resolver
在构建完container容器之后,将其传递给一个新的AutofacDependencyResolver类实例。最后,使用一个静态的方法
DependencyResolver.SetResolver来使得ASP.NET MVC知道如何使用AutofacDependencyResolver定位到相应的服务。
IContainer container = builder.Build();
DependencyResolver.SetResolver(newAutofacDependencyResolver(container));
Register Model Binders
与控制器的注册类似,模型绑定也可以再Global.asax.cs中注册。您可以通过如下操作完成整个程序集的注册:
var builder = newContainerBuilder();
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();
您也必须记住使用
RegisterModelBinderProvider扩展方法来注册
RegisterModelBinderProvider。这个方法用是Autofac对IModelBinderProvider接口的实现。
因为RegisterModelBinders扩展方法通过扫描程序集来添加模型绑定的,所以您需要指定IModelBuilder注册的目标类是什么类型。
[ModelBinderType(typeof(string))]
publicclassStringBinder:IModelBinder
{
publicoverrideobjectBindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
{
//do implementation here
}
}
多行的ModelBuilderTypeAttribute实例可以添加到需要对个类型注册的类中。
Injecting HTTP Abstractions
MVC集成的Autofac模块将会为HTTP抽象类添加HTTP 请求的生命收起范围内的注册。包括依稀抽象类:
- HttpContextBase
- HttpRequestBase
- HttpResponseBase
- HttpServerUtilityBase
- HttpSessionStateBase
- HttpApplicationStateBase
- HttpBrowserCapabilitiesBase
- HttpCachePolicyBase
- VirtualPathProvider
需要使用上面的抽象应该使用容器的
RegisterModule方法来添加
AutofacWebTypesModule
builder.RegisterModule(newAutofacWebTypesModule());
View Page Injection
您可以通过在容器创建之前添加
ViewRegistrationSource 到容器中
使属性注入来使MVC页面可用。
builder.RegisterSource(newViewRegistrationSource());
您的viewpage必须继承MVC类中用于创建,当使用Razor试图引擎时将需要继承WebViewPage类:
publicabstractclassCustomViewPage:WebViewPage
{
publicIDependencyDependency{get;set;}
}
当使用的是webform的试图引擎时,ViewPage,ViewMasterPage和ViewUserControl类都得到相应的支持。
publicabstractclassCustomViewPage:ViewPage
{
publicIDependencyDependency{get;set;}
}
必须确保您实际的试图页面继承了您自定义的基类。在Razor视图引擎.cxhtml中可以使用@inherits指令来实现:
@inheritsExample.Views.Shared.CustomViewPage
使用webform时可以做如下设置
<%@PageLanguage="C#"MasterPageFile="~/Views/Shared/Site.Master"Inherits="Example.Views.Shared.CustomViewPage"%>
Filter Attribute Property Injection
为过滤器使用属性注入必须
在容器创建之前
调用
RegisterFilterProvider方法,并将其传到
AutofacDependencyResolver
ContainerBuilder builder =newContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register(c =>newLogger()).As<ILogger>().InstancePerHttpRequest();
builder.RegisterFilterProvider();
IContainer container = builder.Build();
DependencyResolver.SetResolver(newAutofacDependencyResolver(container));
然后您就可以为您的过滤器添加属性了,并且
publicclassCustomActionFilter:ActionFilterAttribute
{
publicILoggerLogger{get;set;}
publicoverridevoidOnActionExecuting(ActionExecutingContext filterContext)
{
Logger.Log("OnActionExecuting");
}
}
下面是类似用户验证过滤器的自定义特性
publicclassCustomAuthorizeAttribute:AuthorizeAttribute
{
publicILoggerLogger{get;set;}
protectedoverrideboolAuthorizeCore(HttpContextBase httpContext)
{
Logger.Log("AuthorizeCore");
returntrue;
}
}
应用如下:
[CustomActionFilter]
[CustomAuthorizeAttribute]
publicActionResultIndex()
{
// ...
}