My.Ioc 基本使用——简单示例

MyIoc 的使用遵循 Register-Resolve-Release 这样一种模式。

我们先来看如何注册服务。注册一个服务其实非常简单。首先创建一个 IObjectContainer 实例,然后调用该实例的任何一个 Register 方法即可。请看代码:

1 var container = new ObjectContainer(true);
2 container.Register<IService, MyService>();

这里有几点要说明一下:首先说一下 ObjectContainer 对象的构造。这个对象包含几个构造函数。

1 public ObjectContainer()
2 public ObjectContainer(bool useLightweightCodeGeneration)
3 public ObjectContainer(bool useLightweightCodeGeneration, IConstructorSelector constructorSelector)
4 public ObjectContainer(ContainerOption option)

这些构造函数都是用于指定 ContainerOption。

Register 方法包含多个重载,其中主要提供四种注册服务的方式:

  • 注册某个常量或现成的实例对象。
  • 通过 Func 的方式注册某个服务。
  • 通过 Type 方式注册服务,并指定使用 Reflection 方式来构建对象。
  • 通过 Type 方式注册服务,并指定使用 Emit 方式来构建对象。

优化建议:

  • 尽量使用泛型方式进行注册,这样可以在注册服务时避免反射开销,提高性能。
  • 尽量少用 Func 方式进行注册,因为采用这种方式时,框架将无法跟踪服务的依赖项,从而无法在其依赖项注册/注销/激活/停用时通知服务使用者。而且使用 Func 方式注册时,框架每次都需要从注册表中查询依赖项,因而无法利用缓存提高性能。
  • 如果所注册服务的生命周期为 Container 或某种 Singleton,不要显式指定采用 Emit 方式(默认不会采用这种方式)通过动态生成代码来构建对象,因为这类生命周期的对象仅构建一次,之后便复用该对象,不值得再承担动态生成代码这样的开销。
时间: 2024-11-29 11:18:59

My.Ioc 基本使用——简单示例的相关文章

AMQP消息队列之RabbitMQ简单示例

前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个图来概览下: 1.添加Maven依赖 <!-- rabbitmq begin --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit

HMM的维特比算法简单示例

今天读了一位大牛的关于HMM的技术博客,读完之后,写了一个关于维特比算法的简单示例,用scala和java语言混合编写的.现在上传之. package com.txq.hmm import java.utilimport scala.collection._ /** * HMM维特比算法,根据显示状态链条估计隐式链条 * @param states 隐式states * @param observations 显式states * @param start_probability 初始概率向量

spring-servlet.xml简单示例

spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 1 <!-- springMVC简单配置 --> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://w

关于Ajax实现的简单示例

一.代码示例 关于Ajax的基本概念(包括XMLHttpRequest对象及其相关方法属性)移步这里(w3school中文版)学习了解. <!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title>使用Ajax异步加载数据</title> <script type = "text/javasc

【转】bind简单示例

bind简单示例代码 namespace { class placeholder_ {}; placeholder_ __1; } template <typename R, typename T, typename Arg> class simple_bind_t { private: typedef R (T::*F)(Arg); F f_; T* t_; Arg& a_; public: simple_bind_t(F f, T* t, Arg &a) : f_(f),

SQL左连接、右连接和内连接的简单示例

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: inner join(等值连接) 只返回两个表中联结字段相等的行:举例如下: -------------------------------------------- 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录

Backbone简单示例

要的资源: <script type="text/javascript" src="../dep/underscore-1.6.0.min.js"></script> <script type="text/javascript" src="../dep/jquery-1.11.1.min.js"></script> <script type="text/javas

动态网站开发技术学习2:VS 2010制作作第一个简单示例网站

制作一个简单示例网站的步骤: 一,启动VS 2010开发环境,选择菜单中的"文件",选择其中的"新建",再选择"网站",会弹出"新建网站"对话框. 二,在"新建网站"的对话框,在"已安装模板"中选择Visual C#,右侧的选择"ASP.NET网站"选项,单击"新建网 站"中的"文件系统",下拉菜单中有"文件系统&qu

简单示例

下面是一个简单示例,当阀切换至自动模式时,会自动向储罐中补水,到达设定值后自动关闭.当储罐中水位到达设定值后水泵自动开启,水位低时联锁关闭. 上图分别显示了阀门和水泵操作面板 上图显示了水泵的联锁信息 上图是参数设置 上图显示了水位曲线