当前位置 > 首页 > Asp.net

.Net下实现可扩展的编程方法简述

12/7/2012 3:53:00 PM来源:Asp.net

IoC控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则用来解决系统耦合问题。 控制反转还有一个名字叫做依赖注入(DI:Dependency Injection)。IoC中最基本的技术就是interface + reflection,“反射(Reflection)”编程。 。" IoC 容器的职责是对象的创建,核心是对象的生命周期管理(何时创建/怎么创建/何时销毁),就像一个大工厂,对象“托管”在里面。模式的源头都是 SOLID(面向对象的原则)。利用IOC 解耦的核心是:面向抽象,而非实现。即我们只需要关注某一个对象能做什么,怎么用;不需要关注它怎么来,更不需要我们来管理它。
1,Unity
Unity是Enterprise Library 4.0开始加入的一个轻量级的、可扩展的依赖注入容器。
Unity模块包括了下面的特点  
•  提供了一个创建对象,以及依赖的对象的方法  
•  提供的RegisterType方法用来在容器中注册类型和映射,Resolve方法可以返回任何依赖对象的实例。  
•  提供控制反转IOC功能,通过预先配置注入类的对象来实现。你可以在构造函数中指明一个类或者接口(构造函数注入),或者是使用attribute的属性注入,和方法调用注入。
•  支持容器继承,容器可以有子容器,支持对象从子容器传递到父容器中。  
•  可以从标准的配置文件中读取信息,例如xml文件  
•  在运行时可以配置和改变依赖关系。  
•  对类的定义没有任何要求。在类上不需要添加attribute(除非使用属性注入或者是方法调用注入),在类声明中没有任何限制。  
•  支持自定义容器,例如,你可以在方法中实现额外的对象构造,和容器功能,例如容器的缓存功能。

三种注入方式:
•构造器注入(Constructor Injection):IoC容器会智能地选择选择和调用适合的构造函数以创建依赖的对象。如果被选择的构造函数具有相应的参数,IoC容器在调用构造函数之前会自定义创建相应参数对象;
•属性注入(Property Injection):如果需要使用到被依赖对象的某个属性,在被依赖对象被创建之后,IoC容器会自动初始化该属性;
• 方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,IoC容器会自动调用该方法。

定义一个接口:

public interface ILogger
{
void Write(string message);
}

实现接口用来扩展应用程序:

public class FlatFileLogger : ILogger
{
public void Write(string message)
{
Console.WriteLine(String.Format(
"Message:{0}", message));
Console.WriteLine(
"Target:FlatFile");
}
}

主程序:

class Program
{
static void Main(string[] args)
{
ILogger logger
= GetLogger();
logger.Write(
"Test");
System.Console.ReadLine();
}
/// <summary>
/// 加载日志处理对象
/// </summary>
/// <returns></returns>
public static ILogger GetLogger()
{
//初始化一个容器
IUnityContainer container = new UnityContainer();
//获取unity配置
UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
UnityConfigurationSection.CurrentSection.Configure(container);
//向容器中注册对象
ILogger defaultLogger = container.Resolve<ILogger>("Logger");
return defaultLogger;
}
}

扩展配置:

<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>

  • Web setup project multiple default documents

    7/16/2010 8:00:00 AM

    If you want to configure multiple default document in you web setup project, you can do this by sep

  • 虚方法的使用

    11/4/2009 1:33:00 AM

    阅读: 307 评论: 3 作者: 张逸 发表于 2009-11-03 21:58 原文链接 《编程絮语》之一 C#的语法脱胎于C++,因而保留了virtual关键字

  • ASP.NET MVC三个重要的描述对象:ControllerDescriptor和ActionDescriptor的创建

    5/11/2012 8:42:00 AM

    不论是用于描述Controller的ControllerDescriptor,还是用于描述Action方法的ActionDescriptor,都具有同步和异步两个版本,那么这些不同类型的Contro

  • 一张图解读.Net集合类型层级关系

    8/3/2012 9:39:00 PM

    .net类库为我们提供了丰富的集合类型,包括接口和实现。 抽空整理了一下,得出下图,也许用UML会更专业,但没办法,我是导图控:) 可以看出,所有集合相关类型都必须要实现

  • AZMan使用经验点滴

    8/13/2009 5:34:00 PM

    摘要: 本文介绍了AZMan的存储、部署方式,如何在站点配置文件中配置,如何使用授权管理器来进行创建操作、任务、角色等,如何在代码中使用AzMan,文章最后还介绍了常用的命令。 --------

  • C#与数据结构--哈希表(Hashtable)

    6/23/2009 11:49:00 PM

    摘要: C#中实现了哈希表数据结构的集合类有:(1)System.Collections.Hashtable(2)System.Collections.Generic.Dictionary前者为一般

  • F#中的管道操作符

    10/21/2009 10:37:00 AM

    原文出处: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!165.entry Translated by Mike

  • Office Outlook同步 很奇怪的BUG

    2/1/2007 5:56:00 PM

    摘要: 最近项目中Office Outlook同步插件出现奇怪的错误: 1.客户处以前不出错, 现出错; 2.客户处出错,公司内同操作系统下测试不出错; 3.打开Outlook后执行很少出错,

  • SQLServer的数据库镜像实施笔记

    4/10/2009 6:43:00 PM

    摘要: 最初在为公司设计SQLServer数据库镜像的时候,首先考虑的是高可用性(三台计算机,一台见证服务器,一台做主数据库,一台做镜像)在虚拟机环境下部署成功,一切都是那么的完美。 故障转移3秒之

  • 嘿,原来不认识你,想不到你这么好用—说说.NET中被我忽视的方法

    5/8/2012 11:11:00 AM

    .NET中有些方法以前没有接触过,但用过了之后让人眼前一亮,哇,原来你这么好用。 下面就说说被我忽视过的方法。当然,每个人的编程经历,涉猎面及对.NET的认知程度都不一样。所以,这只是一家之言,肯