zoukankan      html  css  js  c++  java
  • ASP.NET MVC IOC 之 Autofac(一)

    新建一个MVC项目,如 AutoFacTest,引用autofac,如下图:

    接下来就是开始进行编程了

    首先,新建一个类库,名为 AutoFacTest.Service,该类库编写服务层代码,我们的接口和实现就都放在服务层

    新建一个IStudentService.cs 接口,具体代码如下:

    namespace AutoFacTest.Service
    {
       public interface IStudentService
       {
           int GetStudentAge(string name);
       }
    }

    接着,新建一个实现类 StudentService.cs ,继承IStudentService,如下:

    namespace AutoFacTest.Service.impl
    {
       public class StudentService:IStudentService
        {
           public int GetStudentAge(string name)
           {
               int age = 0;
               switch (name)
               {
                    case "张三":
                       age = 10;break;
                    case "李四":
                       age = 12;break;
    
               }
               return age;
           }
        }
    }

    定义了一个方法,根据姓名获取年龄。

    服务层准备好了,接下来就是开始做注入工作了。

    打开Global.cs 文件

        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                AutoFacRegister(); //注入
            }
    
            private void AutoFacRegister()
            {
                var builder = new ContainerBuilder();
                //注册MVC控制器(注册所有到控制器,控制器注入,就是需要在控制器的构造函数中接收对象)
                builder.RegisterControllers(typeof(MvcApplication).Assembly);
                /*接口实现,构造函数注入,对StudentService与接口进行注入*/
                builder.RegisterType<StudentService>().As<IStudentService>();
    
                //设置依赖解析器
                var container = builder.Build();
                DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            }
        }

     至此,完成第一步的注入。此方式为构造函数注入的方式。
    接下来就是见证结果的时刻了,我们来看看控制器里面怎么弄。

    新建一个控制器 Home,上控制器代码。

     public class HomeController : Controller
        {
            public IStudentService Stu; //定义全局的学生抽象类对象
            /// <summary>
            /// 通过构造函数进行注入,注意,参数是抽象类,非实现类。因为已经在global中将实现类映射给了抽象类
            /// </summary>
            /// <param name="stu"></param>
            public HomeController(IStudentService stu)
            {
                this.Stu = stu;
            }
            // GET: Home
            public void Index()
            {
                Response.Write("学生类:"+ Stu.GetStudentAge("张三")+"<br />");
            }
        }

    至此,完成处理,接下来,我们就访问 index,看是否能放回张三的年龄。

    我们可以发现,返回了张三的年龄。说明我们注入成功了。

    总结:

    1、采用的是构造函数注入的方式,在构造函数中初始化赋值。

    2、Stu对象不需要实例化,即不需要new。降低了系统资源的消耗。

    3、需要在global中对StudentService写映射,如果服务类比较多的时候,就需要写很多,如何避免,这个在后面章节讲解。

    扩展: 上面讲解了 构造函数注入的方式,下面扩展属性注入的方式。

    在global.cs中稍微修改下注入语句即可。

    将:

     builder.RegisterControllers(typeof(MvcApplication).Assembly);

    改为:

    builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired();
    PropertiesAutowired:即,表示允许属性注入。

    接下来我们来看怎么使用。
     public class HomeController : Controller
        {
            public IStudentService Stu { get; set; } //定义全局的学生抽象类对象
            /// <summary>
            /// 通过构造函数进行注入,注意,参数是抽象类,非实现类。因为已经在global中将实现类映射给了抽象类
            /// </summary>
            // GET: Home
            public void Index()
            {
                Response.Write("学生类:"+ Stu.GetStudentAge("张三")+"<br />");
            }
        }

    控制器里面写的代码就简单很多了。

    注意:Stu必须定义为public类型,否则将映射失败。



  • 相关阅读:
    不同路径II --动态规划
    观察者模式-设计模式
    策略模式-设计模式
    不同路径--动态规划
    最长回文子串--动态规划
    模板方法-设计模式
    爬楼梯-动态规划
    最大子序和 --动态规划
    R.Swift优雅加载资源文件
    最大公约数和最小公倍数
  • 原文地址:https://www.cnblogs.com/fei686868/p/10979790.html
Copyright © 2011-2022 走看看