[Castle Windsor]学习依赖注入
初次尝试使用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();
}
以上是全部用例。简单说一共三步:
- Register,创建容器,注册服务和组件;
- Resolve,获取相应组件;
- 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]学习依赖注入的更多相关文章
- Castle Windsor 学习-----Installer的几种安装方式
翻译 当使用依赖注入容器时,你首先要向容器中注册你的组件,Windsor使用installers(该类型实现IWindsorInstaller接口)来封装和隔离注册的逻辑,可以使用Configurat ...
- Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)
1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等概念.在学习Core依赖注入.服务生命周期之前,下面让我们先 ...
- Spring学习--依赖注入的方式
Spring 依赖注入: 属性注入(最常使用) 构造函数注入 工厂方法注入(很少使用,不推荐) 属性注入:通过 setter 方法注入 Bean 的属性值或依赖的对象 , 使用<property ...
- Java 系列之spring学习--依赖注入(二)
一.依赖注入的三种方式 接口注入,set注入,构造函数注入 二.构造函数注入 2.1.测试类 package test; public class test01 { public String msg ...
- web API .net - .net core 对比学习-依赖注入
今天我们来看一下 .net web api 和 .net core web api依赖注入机制的差异. 首先我们分别在.net web api 和 .net core web api新建文件夹Serv ...
- Spring学习-依赖注入
Spring是基于IOC与AOP的框架,而其中的IOC(Inversion of Control)即反转控制是Spring的基础. 在以前学过的知识中,一个新的对象全部为自己手动new出来的,而在Sp ...
- castle windsor学习-----Inline dependencies 依赖
应用程序中的很多组件都会依赖其他的服务组件,很多依赖一些不合法的组件或者容器中没有的组件,例如int类型.string类型.TimeSpan类型 Windsor支持以上的场景,注册API有Depend ...
- castle windsor学习-----XML Inline Parameters 内联参数
当使用XML配置的时候,可能要给组件指定各种各样的依赖 1.简单的参数 参数名称不区分大小写 <component id="ping" type="Acme.Crm ...
- castle windsor学习----- Referencing types in XML 在xm文件中引用类型
当从xml引用installer的语法如下 <install type="Acme.Crm.Infrastructure.ServicesInstaller, Acme.Crm.Inf ...
随机推荐
- React-native 中的触摸响应功能
我们在做APP的时候,与桌面应用系统不同的是触摸响应. web页面对触摸响应的支持和原生的APP有着很大的差异. 基本用法 componentWillMount: function() { this. ...
- java基础三种循环的使用及区别
摘要:Java新人初学时自己的一些理解,大神们路过勿喷,有什么说的不对不足的地方希望能给予指点指点,如果觉得可以的话,希望可以点一个赞,嘿嘿,在这里先谢了.在这里我主要说的是初学时用到的Java三个循 ...
- js与java通信
js 调用java中的接口并传递参数给客户端处理方式: webView.addJavascriptInterface(new NewsDetail() , "newsDetail" ...
- 用到的IOS知识点小结(1)
以下内容是在ios6模拟器运行成功的,或者与我自己的开发环境有关系. 1.强制转屏,不过不推荐,是私有方法 // if ([[UIDevice currentDevice] respondsTo ...
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
不管是在Java或者Android中运行命令行语句殊途同归都是创建一个子进程运行调用可运行文件运行命令.类似于Windows中的CMD一样. 此时你有两种方式运行:ProcessBuilder与Run ...
- samba 问题Windows能看到文件夹但是不能打开
问题同上,查看防火墙等等各种方法都试过了没能解决,最后问题太弱智了. 设置共享的目录在root下,root是神圣不可侵犯的,怎么能在这个下面呢
- listview自定义背景以及item自定义背景
item向自定义背景,可以根据position来设置不同的背景. listview背景设置是需要注意设置下面这几项: //点下时整个页面的背景 android:cacheColorHint=" ...
- Ewebeditor最新漏洞及漏洞大全
Ewebeditor最新漏洞及漏洞大全[收集] 来源:转载作者:佚名时间:2009-06-03 00:04:26 下面文章收集转载于网络:) 算是比較全面的ewebeditor编辑器的漏洞收集,如今的 ...
- Google maps API开发(一)(转)
一.加载Google maps API <script type="text/javascript" src="http://ditu.google.com/map ...