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 框架源码可在此处获取。

原文地址:https://www.cnblogs.com/johnny-liu/p/3962828.html