[Castle Windsor]学习依赖注入
2016-02-25 17:03
323 查看
初次尝试使用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:
实现它们的类:
创建Main类,作为这个库的入口类:
接下来是如何使用上面创建的类库,以一个winform项目为例,通过NuGet安装Castle.Core、Castle.Windsor,在winform中通过一个按钮事件注册接口:
以上是全部用例。简单说一共三步:
Register,创建容器,注册服务和组件;
Resolve,获取相应组件;
Release,在程序结束时释放资源。
三种依赖注入方式,构造器注入,通过构造函数来提供:
属性注入,依赖可有可无的时候很有用,暴露一个可写的属性,允许客户提供不同的依赖实现:
在使用这个类时,为object1、object2赋值为具体实现接口的类。
方法注入,当依赖对于每个方法调用都不同的时候,可以通过一个方法参数来实现,提供不同的类对象作为参数,就可以有不同的调用效果。
参考:
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赋值为具体实现接口的类。
方法注入,当依赖对于每个方法调用都不同的时候,可以通过一个方法参数来实现,提供不同的类对象作为参数,就可以有不同的调用效果。
相关文章推荐
- EF优缺点的理解
- android中xml tools属性详解
- HTTP协议(二):header标头说明
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- CodeForces 624 B. Making a String(贪心)
- 一台机器安装多个tomcat服务。Java heap space
- HDU 1054 Strategic Game
- 第三章:mysql proxy负载均衡与读写分离
- "Mac OS X"想要进行更改。键入管理员的名称和密码以允许执行此操作("Mac OS X"想使用系统钥匙串)
- 下载
- C#生成图形验证码
- 数据库范式
- Valid Palindrome
- Pavilion M4-1016TX 加装固态硬盘(SSD)+UEFI+GPT安装WIN8.1
- iOS 移除所有子视图
- 字符串搜索算法总结
- 运行时runtime
- 极光推送的使用步骤
- 我理解的三个范式
- PHP基础