ASP.NET MVC IOC 之 Autofac(二)

匿名 (未验证) 提交于 2019-12-02 23:38:02

在上一章节,我们已经知道了再控制器中如何注入以及使用了。这一章,我们重点讲解下,如何在服务层中使用。

我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄。实现在教师类的服务层中调用了学生类的服务接口对象。

新建一个教师类接口: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));

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!