AutoFac学习摘要,MVC结合使用

凭借注入(控制反转)
普遍的借助注入工具:AutoFac,Spring.Net,Unity等
借助注入的不二法门:1.透过构造函数实行注入2.透过品质实行注入

  • MVC下的布局

注意:在类型中AutoFac的流入有一次,第一次是将数据访问层的类注入到事情逻辑层。第1遍是将工作逻辑层的类注入到UI层。

  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(asm瑟维斯)
    .Where(t => !t.IsAbstract).AsImplementedInterfaces().PropertiesAutowired();
    var container=builder.Build();
    //注册在DepandencyResolver中
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

AutoFac在MVC的使用

  • MVC下的应用

我在APP_Start文件夹中新建了二个类命名为AutoFacConfig

  1. 为自定义ModelBinder注入,仍可以够动用builder.RegisterModelBinders()等。

  2. 在Controller中一旦评释瑟维斯的性情即可,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()

概念二个静态的无再次来到的格局

*
  4. 倘诺在quartz等单独的线程中,不能通过DependencyResolver.Current.GetService<ICityService>()获取,能够选拔*

public static void Register()

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

{

 

  

//1.0 创设多少个autofac的器皿对象
            var bulider = new ContainerBuilder();
            //1.0.1 获取程序集载入到Assembly对象中
            Assembly controllerDll = Assembly.Load(“Study.CRM.Site”);
            //1.0.1
告诉autofac对象未来实例化的控制器所存在的顺序集是Study.CPAJEROM.Site.dll
            bulider.RegisterControllers(controllerDll);

            #region 2.0 仓库储存的挂号
            //2.0
利用bulider对象起首创办仓库储存的贯彻类与相应的囤积接口的应和关系
            //注意:即便加了InstancePerHttpRequest()
每一回都是的新的实业举行注入操作

            //注册单个仓库储存来到其对应的接口
           
//bulider.RegisterType(typeof(sysFunctionRepository)).As(typeof(IsysFunctionRepository)).InstancePerHttpRequest();

            //注册程序中拥有的类到其促成接口
            Assembly repositoryAss =
Assembly.Load(“Study.CRM.Repository”);
           
bulider.RegisterTypes(repositoryAss.GetTypes()).AsImplementedInterfaces();

            #endregion

            #region 3.0 业务逻辑层的注册
            //3.0
利用bulider对象早先创立工作逻辑完结类与相应的政工逻辑接口的对象关系
            //单个注册工作逻辑类到其相应的接口
           
//bulider.RegisterType(typeof(sysFunctionServices)).As(typeof(IsysFunctionServices)).InstancePerHttpRequest();

           
//注册业务逻辑程序中的全部类到其落到实处的接口(AsImplementedInterfaces()
此方法:就是用来机关转成接口的)
            Assembly servicesAss =
Assembly.Load(“Study.CRM.Services”);
           
bulider.RegisterTypes(servicesAss.GetTypes()).AsImplementedInterfaces();

            //注册当前先后中项目名称的前缀为sysFunction
的所对应类的实例
            //bulider.RegisterTypes(servicesAss.GetTypes().Where(c =>
c.Name.StartsWith(“sysFunction”)).ToArray()).AsImplementedInterfaces();

            #endregion

            //4.0
告诉MVC框架今后颇具控制器的目的的创导工作交给autofac.dll中的控制器工厂来完结
           
//特点:会使用控制器中的有参数构造函数创立其目的,同时在开创的进度中,会根据构造函数中的
            //接口参数,将此接口的切实可行落到实处类的靶子注入
            //4.0.1 
依据已经登记好的组装创造此容器对象中有着的映照关系的具体贯彻
            var container = bulider.Build();
            // 4.0.2 将MVC的控制器对象实例 交由autofac来创建
            DependencyResolver.SetResolver(new
AutofacDependencyResolver(container));

}

 

在global文件中进行注册

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //注册区域路由规则
            AreaRegistration.RegisterAllAreas();
            //注册全局过滤器
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            //注册网站路由
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            //优化js,css文件
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //利用AutoFac完毕项目标IOC和DI
            AutoFacConfig.Register();
        }
    }