AutoFac与ASP.NET MVC结合使用

  • MVC下的配置
  1. 通过NuGet安装AutoFac插件:Install-Package Autofac.Mvc5  
  2. 在Global中调用:
var builder= new ContainerBuilder();
//注册当前程序集中的所有controller;加上PropertiesAutowired()后,再可以使用属性注入
builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
Assembly asmService= Assembly.Load("TestService");
//在bulider中获取不是抽象类的相关程序集;这块添加PropertiesAutowired()可以让接口调用其他接口,
//实现接口间属性注入
builder.RegisterAssemblyTypes(asmService)
.Where(t => !t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired();
var container=builder.Build();
//注册在DepandencyResolver中
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  • MVC下的使用
  1. 为自定义ModelBinder注入,还可以使用builder.RegisterModelBinders()等。

  2. 在Controller中只要声明Service的属性即可,AutoFac会自动完成属性注入

    public class DefaultController : Controller
    {
    public ZSZ.Common.IUserService userService { get; set; }
    // GET: Default
    public ActionResult Index()
    {
      return View();
    }
    }

    并且在ActionFilter中也可以这样使用属性注入

  3. 只有AutoFac创建的对象才有可能进行自动属性的赋值;但是在没有注入的地方,如果想获取对象,可以这样:

ICityService cityService =DependencyResolver.Current.GetService<ICityService>()

如果在quartz等单独的线程中,无法通过DependencyResolver.Current.GetService<ICityService>()获取,可以使用

var container = AutofacDependencyResolver.Current.ApplicationContainer;
using (container.BeginLifetimeScope())
{
    cityService = container.Resolve<ICityService>();
}