在 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. WSGI规格说明书

    PEP 333 这应该是WSGI最权威的文档了  http://www.python.org/dev/peps/pep-3333/  值翻译了最重要的前面部分,后面读者可以参考 当然文档有些生硬,欢迎 ...

  2. Python使用纯真年代数据库qqwry.dat转换物理位置

    PS:网上直接找的,贴出来,方便以后随时用,感谢分享的人. #!/usr/bin/python #encoding: utf-8 import socket import codecs import ...

  3. Node.js规范化应用

    Node.js运行在一个单线程模式,但它使用一个事件驱动范例来处理并发.它还有助于创建子进程,以充分利用并行处理的多核CPU系统. 子进程总是有三个流child.stdin,child.stdout和 ...

  4. Grails架设和配置--起步

    现在作这些配置有些轻车熟路了.. 因为RAILS ON RUBY和它真的有很多相像的,, 什么DRY,什么约定先于配置这些的概念... 然后,GITHUB上有好文档,可以一步一步的实践.. https ...

  5. JButton 做图片框

    JButton setHorizontalTextPosition(SwingConstants.CENTER);// 在水平方向文字位于图片中央 setVerticalTextPosition(Sw ...

  6. HDNOIP201206施工方案

    HDNOIP201206施工方案 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 c国边防军在边境某处的阵地是由n个地堡组成的. ...

  7. P2032 「Poetize9」升降梯上

    描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄.Nescafe之塔一共有N层,升降 ...

  8. Linux企业级开发技术(3)——epoll企业级开发之epoll模型

    EPOLL事件有两种模型: Edge Triggered (ET)  边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据. Level Triggered (LT)  水平触发 只要有数据都会触 ...

  9. 【转】Chrome保存mhtml网页文件的方法 – 无需任何插件,完美!

    原文网址:http://www.ihacksoft.com/chrome-save-mht.html 在 Chrome 地址栏中键入“chrome://flags”,回车,这是一个 Chrome 的功 ...

  10. HDOJ(HDU) 2162 Add ‘em(求和)

    Problem Description Write a program to determine the summation of several sets of integers. Input Th ...