1. 什么是 IoC ?
关于IoC的详细解释请看 Inversion of Control Containers and the Dependency Injection pattern (英文/中文),本文只会作一些简单介绍
IoC(Inversion of Control),我们叫它"控制反转",也可以叫它"依赖注入"(Dependency Injection)。
引用自 JGTM'2004 [MVP] 的话来解释IoC
>>> 原来我是这样解释应用IoC的意图和方式的(但还是不够清晰):如果我想打破A->B的依赖,那么我可以通过引入A、B之间的交互协议I来办到,也就是将A->B变为(A->I)+(I<-B)(此举同时满足了DIP和OCP原则),那么IoC就是帮助我们用各种各样的方法(如构造器注入、属性注入或接口注入等等)在运行期把I的一个具体实现B传达给A使用的一系列机制。
使用IoC的主要目地就是实现程序模块的低偶合,在DotNet下比较著名的IoC框架是Castle和Spring.net。
2. IoC的三种形式
依赖注入的形式主要有三种,我分别将它们叫做构造子注入(Constructor Injection)、设值方法注入(Setter Injection)和接口注入(Interface Injection)。
3. Castle中的IoC介绍
Castle.IoC 支持构造子注入和设值方法注入,但更侧重构造子注入。
4. 使用Castle.IoC
使用 Castle.IoC 主要是配置 components
4.1 使用代码配置
public static WindsorContainer container = new WindsorContainer( @"..\..\config.xml" );
container.AddComponent( "FormatService", typeof(FormatService) );
container.AddComponent( "format", typeof(IMessageFormat), typeof(HtmlMessage) );
4.2 使用XML文件配置
<?xml version="1.0" encoding="utf-8" ?>
<castle>
<components>
<component id="FormatService"
type="IoCSample.FormatService,IoCSample" />
<component id="format"
service="IoCSample.Components.IMessageFormat,IoCSample"
type="IoCSample.Components.HtmlMessage,IoCSample" />
</components>
</castle>
如何配置IList,IDictionary,Array等复杂类型IDictionary
代码:
public class C


{

public C()
{}
public C(IDictionary d)

{
this.dictionary=d;
}
private IDictionary dictionary;
public IDictionary Dictionary

{

get
{return this.dictionary;}
}
}
配置:
<component id="c" type="CastleDemo.C,CastleDemo">
<parameters>
<d>
<item keyType="System.String" valueType="System.String">
<item key="a">a</item>
<item key="b">b</item>
</item>
</d>
</parameters>
</component>
IList
代码:
public class D


{
private IList list;

public D()
{}
public IList List

{

get
{return this.list;}
}
public D(IList list)

{
this.list=list;
}
}
配置:
<component id="d" type="CastleDemo.D,CastleDemo">
<parameters>
<list>
<item type="System.String">
<item>a</item>
<item>b</item>
<item>c</item>
</item>
</list>
</parameters>
</component>
Array
代码:
public class E


{
private int[] ages;
public int[] Ages

{

get
{return this.ages;}
}
public E()

{
}
public E(int[] ages)

{
this.ages=ages;
}
}
配置:
<component id="e" type="CastleDemo.E,CastleDemo">
<parameters>
<ages>
<item type="System.Int32">
<item>1</item>
<item>2</item>
<item>3</item>
</item>
</ages>
</parameters>
</component>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码