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类型,否则将映射失败。



 

posted @ 2019-06-05 15:19  黄明辉  阅读(513)  评论(0编辑  收藏  举报