当前位置 > 首页 > Asp.net

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

2012-12-7 15:53:00来源: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>

  • Hilo: Windows7 开发教程

    2010-7-21 11:57:00

    [原文发表地址] Hilo: Windows 7 development walk-throughs [原文发表时间] 9 Jul 2010 6:14 PM Windows 7 中

  • 【译】使用Ninject进行简单依赖注入

    2009-12-13 19:51:00

    阅读: 36 评论: 0 作者: CareySon 发表于 2009-12-13 19:18 原文链接     那些最好的程序能够容纳不断变化的需求,当然,要

  • [译].Google Chrome extensions(实验室).开始

    2010-3-18 14:07:00

    阅读: 752 评论: 8 作者: island205 发表于 2010-03-18 08:43 原文链接 教程:开始(Hello,World!) 这个教程先带着你做一个简

  • 发现博客园的文章被盗取

    2007-6-19 18:00:00

    刚发现一个Blog: http://dotnet.itpub.net 不断盗取博客园文章,既不加原文链接,也不加原作者名字,而且连转贴都没有注明。 这种行为大家怎么看?能投诉吗? Ch

  • 【Asp.Net MVC 以小见大】一步一步改写简单的登录注册(一)

    2009-7-10 0:40:00

    写这篇文章其实心里是比较忐忑的,确实Asp.Net MVC框架出来了很长时间了,我这篇文章稍有过时之嫌。不过本着分享学习的态度,还是写一写吧。MVC框架的文章园子里已经很多了,想专题中的重典、老赵、

  • skmMenu code change to work with xhtml doctypes

    2007-3-23 2:28:00

    This is just a re-statement of a forum thread that discusses the fix, but since gotdotnet is no

  • VB.NET 如何检测网络状态

    2010-12-6 16:23:00

    ? 我要做软件的自动更新功能,类似360安全卫士那样,在软件下方会显示当前版本,最新版本等等 ? 我的实现方法是把最新版本信息做成html文件挂在空间上,然后旁边还有个立即更新链接到下载

  • .Net通用基础框架(.Net Common Infrastructure)-缓存

    2011-3-16 20:47:00

    缓存可以提高网站性能,减轻数据库压力。网站中常用的缓存分为业务数据缓存和页面文件缓存两类,其中业务数据缓存常用AspnetCache,Memcached等,而页面文件缓存常用Squid和Nginx,

  • Asp.net 利用Jquery Ajax传送和接收DataTable

    2010-9-11 12:19:00

    作者: 三聪 发表于 2010-09-11 10:41 原文链接 阅读: 209 评论: 2 对于习惯使用GridView的人来说,前台页面需要动态添加表格的行数,是一件痛苦的事。Gr

  • Observer Design Pattern

    2010-1-12 19:04:00

    Hi, Many times when programming we come across situation where by change in one change needs