• 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));
  • 相关阅读:
    发布AI芯片昆仑和百度大脑3.0、L4自动驾驶巴士量产下线,这是百度All in AI一年后的最新答卷...
    Redis 使用多个数据库及密码配置
    Redis 使用多个数据库及密码配置
    Redis 使用多个数据库及密码配置
    [Winform]DataGridView列自适应宽度
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    运筹学那些事,专科学生学习运筹学之图论方法,No.7
    SpringMVC的HttpMessageConverter
    @ResponseStatus的作用
  • 原文地址:https://www.cnblogs.com/fei686868/p/10996959.html
Copyright © 2020-2023  润新知