zoukankan      html  css  js  c++  java
  • MVC中Autofac的使用

    参考博文

    https://www.cnblogs.com/liupeng/p/4806184.html

    https://blog.csdn.net/qq_37214567/article/details/78227628?locationnum=2&fps=1

    引用

    第一个为Autofac

    第二个为Autofac的MVC扩展

    项目结构

    测试使用的表名称为SysSample,图中2-6为其BLL、DAL、IBLL、IDAL、Models 项目

    关系

    使用

    构造函数注入

    (1)自动注入。BLL、Controller  均是由Autofac统一注入

    a.创建一个 统一被继承的接口,IDependency

    b.引用。BLL、IBLL、DAL、IDAL 四个项目均引用IDependency所在的Apps.AutofacBase项目。

    c.继承.。ISysSampleBLL和ISysSampleRepository均继承此接口

    d.构造函数。SysSampleBLL和SysSampleController构造函数修改。

    e.Web项目的引用。Web需要添加对BLL、IBLL、DAL、IDAL四个项目的引用。否则自动注入时,缺少未引用项目的注入信息。

    f.Application_Start()方法的修改

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    using Apps.AutofacBase;
    using Apps.BLL;
    using Apps.DAL;
    using Apps.IBLL;
    using Apps.IDAL;
    using Autofac;
    using Autofac.Integration.Mvc;
    
    namespace Apps.Web
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
    
                //启用jscss压缩
                BundleTable.EnableOptimizations = true;
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                #region 自动注入
    
                //创建autofac管理注册类的容器实例
                var builder = new ContainerBuilder();
                Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
                //注册所有实现了 IDependency 接口的类型
                Type baseType = typeof(IDependency);
                builder.RegisterAssemblyTypes(assemblies)
                       .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
                       .AsSelf().AsImplementedInterfaces()
                       .PropertiesAutowired().InstancePerLifetimeScope();
    
                //注册MVC类型
                builder.RegisterControllers(assemblies).PropertiesAutowired();
                builder.RegisterFilterProvider();
                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
                #endregion
    
            }
        }
    }

    (2)手动注入

    无需创建IDependency接口。

    需要将所有需要注入的类、接口、调用者一一列出。

    Application_Start()方法的修改

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    using Apps.AutofacBase;
    using Apps.BLL;
    using Apps.DAL;
    using Apps.IBLL;
    using Apps.IDAL;
    using Apps.Web.Controllers;
    using Autofac;
    using Autofac.Integration.Mvc;
    
    namespace Apps.Web
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
    
                //启用jscss压缩
                BundleTable.EnableOptimizations = true;
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                #region 手动注入
    
                //创建autofac管理注册类的容器实例
                var builder = new ContainerBuilder();
                
                /*需要进行依赖注入的IBLL*/
                //类和接口的关系
                builder.RegisterType<SysSampleRepository>().As<ISysSampleRepository>();       
                builder.RegisterType<SysSampleBLL>().As<ISysSampleBLL>();
    
                //调用者的注入。
                builder.RegisterType<SysSampleBLL>().InstancePerDependency();//SysSampleBLL中调用了DAL层
    
                //(不推荐)单个Controller控制器注册
                builder.RegisterType<SysSampleController>().InstancePerDependency();//SysSampleController调用的BLL层
    
    
                //(推荐写法)使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册                        
                //builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
                //生成具体的实例
                var container = builder.Build();
                //下面就是使用MVC的扩展 更改了MVC中的注入方式.
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    
    
    
                #endregion
    
            }
        }
    }

    属性注入

    (1)自动注入。

    a.与1.(1) 构造函数注入的自动注入 配置,大部分一致,

    b.需要修改的地方。注入调用者时,需要在最后面加上.PropertiesAutowired();

     引用的对象,将构造函数修改为属性。

     (2)手动注入

    a.与2.(1) 同理,大部分一致

    b.需要修改的地方。百度上说注入调用者时,需要在最后面加上.PropertiesAutowired();

    但是在实际调用时,仍然调用失败。未进行深入研究。

    备注

    (1)构造函数注入修改为属性注入。主要的区别就是需要在注册调用者 后面加上.PropertiesAutowired();

    (2)目前VS2012,能完全引用Autofac.dll Autofac.Configuration.dll Autofac.Integration.Mvc.dll 三个文件的版本信息,如下

    Install-Package Autofac -version 3.5.2

    Install-Package Autofac.Configuration -Version 3.3.0

    Install-Package Autofac.Mvc5 -version 3.3.4

    主要是Configuration的dll,3.3.0后面的就是4.0.0beta版本。

    VS2012再引用时就会报错了,好像是因为VS2012最多只能创建.Net4.5版本的项目导致。

    具体原因没有细究。

    而且本人使用的项目中,因为使用了自动注入的方式,就没有再使用Configuration进行config的配置了。

    (3)为书写和观看方便,本人项目当前使用的是。自动注入+属性注入。

  • 相关阅读:
    web.xml配置详解(转载)
    http协议无状态中的 "状态" 到底指的是什么?!(转载)
    sublime配置python运行环境
    Eclipse下载安装教程
    局域网访问文件共享了访问不了解决方法
    ThreadLocal实现线程级上下文
    Spring中ApplicationEvent和ApplicationListener封装
    MySQL根据出生日期计算年龄的五种方法比较
    常用正则
    java.lang.OutOfMemoryError: PermGen space有效解决方法
  • 原文地址:https://www.cnblogs.com/masonblog/p/9537326.html
Copyright © 2011-2022 走看看