在 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 == ); 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", )
.WithMethod("PrintRoomName")
.In(Lifetime.Container());
container.Register<Room>()
.WithPropertyAutowired("Grade")
.WithPropertyValue("Name", "RoomNameInjected")
.In(Lifetime.Transient());
container.CommitRegistrations();
}
}
}

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

.WithPropertyValue("TeacherName", "Johnny")
.WithPropertyValue("StudentCount", )
.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 框架源码可在此处获取。

My.Ioc 代码示例——属性和方法注入的更多相关文章

  1. My.Ioc 代码示例——如何使用默认构造参数,以及如何覆盖默认构造参数

    在 Ioc 世界中,有些框架(例如 Autofac/NInject/Unity)支持传递默认参数,有些框架(例如 SimpleInjector/LightInjector 等)则不支持.作为 My.I ...

  2. Spring第六弹—-依赖注入之使用构造器注入与使用属性setter方法注入

    所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中. 使用构造器注入   1 2 3 4 <constructor-arg index=“0” type=“java.lang. ...

  3. .NET手记-Autofac进阶(属性和方法注入 Property and Method Injection)

    尽管构造函数参数注入是传递参数值给当前构造的组件的优先方式,但是你也可以使用属性或者方法注入来提供参数值. 属性注入使用可写入的变量而不是构造函数参数来完成注入.方法注入则通过方法来设置依赖项. 属性 ...

  4. Autofac官方文档翻译--一、注册组件--3属性和方法注入

    官方文档:http://docs.autofac.org/en/latest/register/prop-method-injection.html Autofac 属性和方法注入 虽然构造函数参数注 ...

  5. My.Ioc 代码示例——谈一谈如何实现装饰器模式,兼谈如何扩展 My.Ioc

    装饰器模式体现了一种“组合优于继承”的思想.当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手. 很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac.在 My.Io ...

  6. My.Ioc 代码示例——实现自动注册/解析

    在很多 Ioc 容器中,当使用者向容器请求实现了某个契约类型 (Contract Type) 的服务时 (调用类似如下方法 container.Resolve(Type contractType)), ...

  7. My.Ioc 代码示例——使用观察者机制捕获注册项状态的变化

    在 My.Ioc 中,要想在服务注销/注册时获得通知,可以通过订阅 ObjectBuilderRegistered 和 ObjectBuilderUnregistering 这两个事件来实现.但是,使 ...

  8. My.Ioc 代码示例——避免循环依赖

    本文的目的在于通过一些示例,向大家说明 My.Ioc 支持哪些类型的依赖关系.也就是说,如何设计对象不会导致循环依赖. 在 Ioc 世界中,循环依赖是一个顽敌.这不仅因为它会导致 Ioc 容器抛出异常 ...

  9. My.Ioc 代码示例——利用 ObjectBuilderRequested 事件实现延迟注册

    在使用 Ioc 框架时,一般我们建议集中在一个称为 Composition Root(其含义请参见下面的小注)的位置来注册 (Register) 和解析 (Resolve) 服务.这种做法的目的在于限 ...

随机推荐

  1. 一个获取Android手机root权限的程序

    PermRoot.bat可以获取root权限. IsRoot.bat可以测试是否拥有root权限. UnRoot.bat可以清除root权限. 下载地址: http://pan.baidu.com/s ...

  2. IOS中UIButton和UIImageView的区别

    1.使用场合 UIImageView:如果仅仅是为了显示图片,不需要监听图片的点击事件 UIButton:既要显示图片,又要监听图片等点击事件 2.相同点 都能显示图片 3.不同点 UIButton能 ...

  3. zabbix 默认item采集使用被动模式 需要改为主动模式

    数据采集的工作模式可以分为被动模式(服务器端到客户端采集数据) 主动模式(客户端主动上报数据到服务器端) 服务器配置: DBHost=192.168.32.55 DBName= zabbix DBUs ...

  4. id有空格获取不到元素

  5. Javascript面向对象编程(二):构造函数的继承 by 阮一峰

    今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动物"对象的构造函数. function Animal(){ this.species = & ...

  6. IOI 2009:Mecho

    IOI2009 Mecho Time Limit: 10000ms Memory Limit: 262144KB This problem will be judged on SPOJ. Origin ...

  7. Mac下Shell快捷键

    ctrl+a //移到行首 ctrl+e //移到行尾 ctrl+y // 插入最近删除的单词或语句 ctrl+k //删除光标处到行尾部分 ctrl+u //删除光标处到行首部分 ctrl+w // ...

  8. Codeforces Round #335 (Div. 1)--C. Freelancer's Dreams 线性规划对偶问题+三分

    题意:p, q,都是整数. sigma(Ai * ki)>= p, sigma(Bi * ki) >= q; ans = sigma(ki).输出ans的最小值 约束条件2个,但是变量k有 ...

  9. phantomjs截图的实践

        年前也做了一些东西,由于过年只顾疯了,也没有整理,年后补上把~ 今天整理一下个phantomjs截图实践中遇到的问题.           最近做的一个项目,需要在首页展示已经做的一些项目的缩 ...

  10. O - Extended Traffic(判断负环)

    题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市I到另一个城市J的时间为:(aJ-aI)^3,存在负环.问从第一个城市到达第k个城市所话的时间,如果不能到达,或者时间小于3输出?否则输出所花的 ...