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