ASP.NET MVC IOC 之 Autofac
Posted fei686868
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC IOC 之 Autofac相关的知识,希望对你有一定的参考价值。
在上一章节,我们已经知道了再控制器中如何注入以及使用了。这一章,我们重点讲解下,如何在服务层中使用。
我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄。实现在教师类的服务层中调用了学生类的服务接口对象。
新建一个教师类接口:ITeacherService.cs
namespace AutoFacTest.Service public interface ITeacherService int GetStudentAge(string name);
接着定义一个 教师实现类,TeacherService.cs
public class TeacherService:ITeacherService /// <summary> /// 定义学生接口服务类 /// </summary> private readonly IStudentService _stu; /// <summary> /// 实现构造函数注入 /// </summary> /// <param name="stu"></param> public TeacherService(IStudentService stu) _stu = stu; /// <summary> /// 调用学生类,获取学生信息 /// </summary> /// <param name="name"></param> /// <returns></returns> public int GetStudentAge(string name) return _stu.GetStudentAge(name);
从上面的代码,我们可以看到我们在TeacherService的构造函数中已经实现了学生抽象类的注入。通过下一步在全局注入即可完成实例化。
下一步,在global中,新增教师类的注入
private void AutoFacRegister() var builder = new ContainerBuilder(); //注册MVC控制器(注册所有到控制器,控制器注入,就是需要在控制器的构造函数中接收对象) // builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired(); /*接口实现*/ builder.RegisterType<StudentService>().As<IStudentService>(); builder.RegisterType<TeacherService>().As<ITeacherService>(); //设置依赖解析器 var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
以上,我们就做好准备了。
下一步,界面显示
public class HomeController : Controller public IStudentService Stu get; set; //定义全局的学生抽象类对象 public ITeacherService Teac get; set; /// <summary> /// 通过构造函数进行注入,注意,参数是抽象类,非实现类。因为已经在global中将实现类映射给了抽象类 /// </summary> // GET: Home public void Index() Response.Write("学生类:"+ Stu.GetStudentAge("张三")+"<br />"); Response.Write("教师类:"+Teac.GetStudentAge("张三")+"<br />");
然后浏览网页看结果:
已经实现了在服务层中的调用学生抽象类。这说明了一个点,autofac的注入是全局。
大家可能会发现在我们的global文件中,所有服务层的类都需要一个个注册,那如果很多类的话,那可写老长了。
autofac还提供的其他类型注入,下面就介绍我们的解决办法。
定义一个公共空接口 IDependency,所有实现类都集成这个接口。
namespace AutoFacTest.Service /// <summary> /// 空接口对象,用于一次性注入 /// </summary> public interface IDependency
然后 学生类,和教师类都继承
public class TeacherService:ITeacherService, IDependency
public class StudentService:IStudentService, IDependency
在global中,换个方式进行注入
private void AutoFacRegister() var builder = new ContainerBuilder(); //注册MVC控制器(注册所有到控制器,控制器注入,就是需要在控制器的构造函数中接收对象) // builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired(); /*接口实现*/ // builder.RegisterType<StudentService>().As<IStudentService>(); // builder.RegisterType<TeacherService>().As<ITeacherService>(); //注册所有实现了 IDependency 接口的类型 Type baseType = typeof(IDependency); Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray(); builder.RegisterAssemblyTypes(assemblies) .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsSelf().AsImplementedInterfaces() .PropertiesAutowired().InstancePerLifetimeScope(); //设置依赖解析器 var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
以上是关于ASP.NET MVC IOC 之 Autofac的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC IOC依赖注入之Autofac系列- WebForm当中应用
ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)
[Asp.Net Core]Autofac整合.NET5 MVC
[Asp.Net Core]Autofac整合.NET5 MVC
ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)