初次尝试使用Castle Windsor实现依赖注入DI,或者叫做控制反转IOC。

参考:

https://github.com/castleproject/Windsor/blob/master/docs/README.md

http://terrylee.cnblogs.com/archive/2006/04/17/377018.html

依赖注入就是基于接口interface编程,而不是具体的类,实现松耦合,易于单元测试,将接口定义为服务,具体实现某一服务的类为组件。

Windsor有一个基础的用例。

一个类库工程中有两个接口IDependency1、IDependency2:

namespace ClassLibrary1
{
public interface IDependency1
{
object SomeObject { get; set; }
} public interface IDependency2
{
object SomeOtherObject { get; set; }
}
}

实现它们的类:

namespace ClassLibrary1
{
public class Dependency1 : IDependency1
{
public object SomeObject { get; set; }
} public class Dependency2 : IDependency2
{
public object SomeOtherObject { get; set; }
}
}

创建Main类,作为这个库的入口类:

namespace ClassLibrary1
{
public class Main
{
private IDependency1 object1;
private IDependency2 object2; public Main(IDependency1 dependency1, IDependency2 dependency2)
{
object1 = dependency1;
object2 = dependency2;
} public void DoSomething()
{
object1.SomeObject = "Hello World";
object2.SomeOtherObject = "Hello Mars";
}
}
}

接下来是如何使用上面创建的类库,以一个winform项目为例,通过NuGet安装Castle.Core、Castle.Windsor,在winform中通过一个按钮事件注册接口:

using Castle.MicroKernel.Registration;
using Castle.Windsor; private void button1_Click(object sender, EventArgs e)
{
// CREATE A WINDSOR CONTAINER OBJECT AND REGISTER THE INTERFACES, AND THEIR CONCRETE IMPLEMENTATIONS.
var container = new WindsorContainer();
container.Register(Component.For<Main>());
container.Register(Component.For<IDependency1>().ImplementedBy<Dependency1>());
container.Register(Component.For<IDependency2>().ImplementedBy<Dependency2>()); // CREATE THE MAIN OBJECT AND INVOKE ITS METHOD(S) AS DESIRED.
var mainThing = container.Resolve<Main>();
mainThing.DoSomething();
  container.Dispose();
}

以上是全部用例。简单说一共三步:

  1. Register,创建容器,注册服务和组件;
  2. Resolve,获取相应组件;
  3. Release,在程序结束时释放资源。

三种依赖注入方式,构造器注入,通过构造函数来提供:

    public class Main
{
private IDependency1 object1;
private IDependency2 object2; public Main(IDependency1 dependency1, IDependency2 dependency2)
{
object1 = dependency1;
object2 = dependency2;
}
  }

属性注入,依赖可有可无的时候很有用,暴露一个可写的属性,允许客户提供不同的依赖实现:

    public class Main
{
public IDependency1 object1{ get; set; }
public IDependency2 object2{ get; set; }
  }

在使用这个类时,为object1、object2赋值为具体实现接口的类。

方法注入,当依赖对于每个方法调用都不同的时候,可以通过一个方法参数来实现,提供不同的类对象作为参数,就可以有不同的调用效果。

关键字:.NET,DI,Castle Windsor

[Castle Windsor]学习依赖注入的更多相关文章

  1. Castle Windsor 学习-----Installer的几种安装方式

    翻译 当使用依赖注入容器时,你首先要向容器中注册你的组件,Windsor使用installers(该类型实现IWindsorInstaller接口)来封装和隔离注册的逻辑,可以使用Configurat ...

  2. Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)

    1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等概念.在学习Core依赖注入.服务生命周期之前,下面让我们先 ...

  3. Spring学习--依赖注入的方式

    Spring 依赖注入: 属性注入(最常使用) 构造函数注入 工厂方法注入(很少使用,不推荐) 属性注入:通过 setter 方法注入 Bean 的属性值或依赖的对象 , 使用<property ...

  4. Java 系列之spring学习--依赖注入(二)

    一.依赖注入的三种方式 接口注入,set注入,构造函数注入 二.构造函数注入 2.1.测试类 package test; public class test01 { public String msg ...

  5. web API .net - .net core 对比学习-依赖注入

    今天我们来看一下 .net web api 和 .net core web api依赖注入机制的差异. 首先我们分别在.net web api 和 .net core web api新建文件夹Serv ...

  6. Spring学习-依赖注入

    Spring是基于IOC与AOP的框架,而其中的IOC(Inversion of Control)即反转控制是Spring的基础. 在以前学过的知识中,一个新的对象全部为自己手动new出来的,而在Sp ...

  7. castle windsor学习-----Inline dependencies 依赖

    应用程序中的很多组件都会依赖其他的服务组件,很多依赖一些不合法的组件或者容器中没有的组件,例如int类型.string类型.TimeSpan类型 Windsor支持以上的场景,注册API有Depend ...

  8. castle windsor学习-----XML Inline Parameters 内联参数

    当使用XML配置的时候,可能要给组件指定各种各样的依赖 1.简单的参数 参数名称不区分大小写 <component id="ping" type="Acme.Crm ...

  9. castle windsor学习----- Referencing types in XML 在xm文件中引用类型

    当从xml引用installer的语法如下 <install type="Acme.Crm.Infrastructure.ServicesInstaller, Acme.Crm.Inf ...

随机推荐

  1. iOS中的深复制与浅复制

    很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: ...

  2. HALCON 简介

    HALCON   windowssolarisgccdelphilinux图像处理 ·满足您各类机器视觉应用需求的完善的开发库 ·包含匹配,识别,定位及1D,2D,3D测量等多种高级算法 ·强大,易用 ...

  3. SQLite使用教程9 Select 语句

    http://www.runoob.com/sqlite/sqlite-select.html SQLite Select 语句 SQLite 的 SELECT 语句用于从 SQLite 数据库表中获 ...

  4. 【Android】 图片编辑:创建圆角图片

    创建圆角图片的方式大同小异,最简单的就是 9.png 美工做出来的就是.这种最省事直接设置就可以. 另外一种就是通过裁剪 这里的剪裁指的是依据原图我们自己生成一张新的bitmap,这个时候指定图片的目 ...

  5. 0 Explore TreeView

    尽可能接近WINDOWS 8的资源管理器效果(这里只模仿它的效果,处理文件功能不包括在内)   TREEVIEW可以增加空白并且空白处不能单击 重绘三角箭头 重绘选中时的边框和填充色 重绘失去焦点时选 ...

  6. [MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 2

    We are not finishing yet... 1. Under MIGX Management, we need to add some "Actionbuttons" ...

  7. 基于反射实现自己主动化restful开发

    [Author]: kwu 基于反射实现自己主动化restful开发,通用的仅仅须要写查询数据库的sql.并增加相应的javabean实现的高速restful服务的开发. 1.编写数据库的查询sql. ...

  8. 应聘.net开发工程师常见的面试题(五)

    1.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是.可以用任意类型. 2.在C#中,string str = null 与 string str = ” ” 请尽量使用文字或图象 ...

  9. 四、Socket之UDP异步传输文件-用控件显示文件传输进度

    上一篇文章三.Socket之UDP异步传输文件中,实现了多文件的传输和MD5校验,还显示了文件传输过程中的信息,在这一篇文章中,将介绍怎样实现传输文件的进度显示和实现选择保存文件路径. 首先,来实现一 ...

  10. ExtJs Tree加载选项卡,选项卡加载页面不用iframe

    点击树节点,自动加载选项卡对应的页面, 效果图: JS Code: 一.创建TreeStore var store = Ext.create('Ext.data.TreeStore', { root: ...