• My.Ioc 代码示例——属性和方法注入


    在 My.Ioc 中,我们可以指定让容器在构建好对象实例之后,自动为我们调用对象的公共方法或是为对象的公共属性赋值。在解析对象实例时,容器将根据我们在注册对象时指定的方法调用或属性赋值的先后顺序,调用对象的实例方法或为其属性赋值。

    用法比较简单,请看下面的示例代码:

    using System;
    using System.Diagnostics;
    using My.Ioc;
    
    namespace PropertyAndMethodInjection
    {
        #region Test Types
    
        public class Teacher
        {
        }
    
        public class Grade
        {
            public Grade(Teacher teacher)
            {
                Teacher = teacher;
            }
    
            public Teacher Teacher { get; private set; }
            public int StudentCount { get; set; }
            public string TeacherName { get; set; }
    
            public void PrintRoomName(Room room)
            {
                Console.WriteLine(room.Name ?? "No room name given!");
            }
        }
    
        public class Room
        {
            public Grade Grade { get; set; }
            public string Name { get; set; }
        }
    
        #endregion
    
        class Program
        {
            static void Main(string[] args)
            {
                IObjectContainer container = new ObjectContainer(false);
                Register(container);
    
                var grade = container.Resolve<Grade>();
                Debug.Assert(grade.TeacherName == "Johnny");
                Debug.Assert(grade.StudentCount == 50);
    
                var room = container.Resolve<Room>();
                Debug.Assert(room.Grade != null);
    
                Console.ReadLine();
            }
    
            static void Register(IObjectContainer container)
            {
                container.Register<Teacher>().In(Lifetime.Container());
                container.Register<Grade>()
                    .WithPropertyValue("TeacherName", "Johnny")
                    .WithPropertyValue("StudentCount", 50)
                    .WithMethod("PrintRoomName")
                    .In(Lifetime.Container());
                container.Register<Room>()
                    .WithPropertyAutowired("Grade")
                    .WithPropertyValue("Name", "RoomNameInjected")
                    .In(Lifetime.Transient());
                container.CommitRegistrations();
            }
        }
    }

    在上面这个示例中,我们看到在注册  Grade 对象时,分别调用了下面三个方法:

    .WithPropertyValue("TeacherName", "Johnny")
    .WithPropertyValue("StudentCount", 50)
    .WithMethod("PrintRoomName")

    这三个方法告诉容器在创建好 Grade 对象实例后,依次执行下列操作:

    1. Grade 对象TeacherName 属性赋值为 Johnny。
    2. Grade 对象的 StudentCount 属性赋值为 50。
    3. 调用 Grade 对象的公共方法 PrintRoomName

    这里,我们注意到 PrintRoomName 这个方法中包含一个参数 room,其类型是 Room,这是一个可以自动装配的参数类型。因此,容器在调用该方法时,将会自动为我们创建一个 Room 对象,并将其作为参数传递到 PrintRoomName 方法调用中。

    接下来,我们看到在示例代码中注册了 Room 这个对象,同时看到使用了 WithPropertyAutowired 这个 API,它告诉容器 Room 对象的 Grade 属性是可以自动装配的,在创建好 Room 对象之后,应自动为其 Grade 属性提供一个属性值。

    本文示例代码以及 My.Ioc 框架源码可在此处获取。

  • 相关阅读:
    composer 中国全量镜像 laravel-china.org
    Increase PHP script execution time with Nginx
    How to make a USB stick use ISO image file in debian
    Getting svn to ignore files and directories
    Carbon document
    Use Laravel/homestead 环境维护基于 brophp 开发的老项目
    Vagrant WinNFSd
    How to use jQuery countdown plugin
    消息系统的设计与实现
    VMvare 复制的数据库,需要改变的配置
  • 原文地址:https://www.cnblogs.com/johnny-liu/p/3962828.html
Copyright © 2020-2023  润新知