zoukankan      html  css  js  c++  java
  • 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 框架源码可在此处获取。

  • 相关阅读:
    使用PHP调用TinyURL API的方法
    基于MySQL数据库的UTF8中文网站全文检索的实现
    PHP版单点登陆实现方案
    php框架codeigniter是如何实现mvc模式以及单一入口
    网友分享:二十五个顶级PHP模板引擎整理
    数据库置疑的处理办法
    使用Log Explorer恢复数据
    使用Log Explorer恢复数据
    11个故事 11个道理
    VS2008 WinForm 去掉DataGridView最后一行的那个空白行
  • 原文地址:https://www.cnblogs.com/johnny-liu/p/3962828.html
Copyright © 2011-2022 走看看