当前位置 > 首页 > 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>

  • asp.net MVC 权限设计(续)

    2011-1-24 13:49:00

    asp.net MVC 权限设计 一文中没有demo放出来,应大家的要求,这里补充上文并放出demo。 几点说明: 1、基于将角色与controller、action相关联来判

  • Playing With SQL Server CLR Integration – Part III

    2009-6-12 10:25:00

    You might have noticed that I used LINQ in my last Playing With SQL Server CLR Integration posts

  • How to test Asp.Net ControlDesigners without VisualStudio? (PROTOTYPE)

    2009-3-21 11:58:00

    I was recently tasked to prototype a way to test our ControlDesigners without using VisualStudio. F

  • 武汉net

    2010-8-26 23:45:00

    各位群里的好友: 我的QQ号是:1047059243 我的电话号码是:13871352100(武汉) 岗位职责: 1、熟练使用.NET(C#),熟练winform并有已完成作

  • Workflow WF Reference Links for 2009-02-06

    2009-2-6 17:48:00

    摘要: Workflow Reference Links:1. 到底谁需要BPEL? 文章中,作者Keith对当今BPM产品中的BPEL使用情况进行了评估,并建议用可以直接执行的、基于BPMN的流程

  • Changes to the Publish dialog in web application project system in Visual Studio 2010

    2009-6-17 9:15:00

    This blog explains some modification we made to the publish dialog in the web application project s

  • mvc 之后是什么?

    2009-2-4 1:07:00

    摘要:      在刚刚从事 java web  方面开发的时候,比较喜欢struts 框架,虽然只是一个jar 包,以为加上几个 ORM 的相关框架,jav

  • A tutorial on nested classes in C#

    2007-9-26 20:40:00

    In this short tutorial Chetan Kudalkar is going to discuss nested classes. Nested classes are cl

  • 将Quartz.NET集成到 Castle中

    2007-9-6 23:17:00

    摘要: Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很

  • Silverlight实现查询建模(编外) 源代码及运行方法

    2009-9-9 21:49:00

    摘要: 源代码在这里下载,下载后在Sql Server2005中恢复数据库。然后打开VS2008编译,注意由于生成事件脚本要进行拷贝动作。所以代码放置的路径不要太深。 配置好数据库后修改 项目路径\