一对一注册

直接注册组件

container.Register(
Component.For<MyServiceImpl>()
);

注册接口并提供组件

container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
); //非泛型重载方法,和上面的效果是一样的
container.Register(
Component.For(typeof(IMyService))
.ImplementedBy(typeof(MyServiceImpl))
);

注册泛型类

container.Register(
Component.For(typeof(IRepository<>)
.ImplementedBy(typeof(NHRepository<>)
);

配置组件的声明周期

container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
.LifeStyle.Transient
);

如果配置LifeStyle,默认的声明周期是Singleton

同一个接口注册多个组件

container.Register(
Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()
);

这种情况下,当容器解析获得组件的时候默认得到的是第一个被注册的,现在是MyServiceImpl,但是我们可以通过IsDefault方法来设置默认组件,

container.Register(
Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
Component.For<IMyService>().ImplementedBy<OtherServiceImpl>().IsDefault()
);

这样Resolve将会得到OtherServiceImpl组件,还有一种方法就是给每个组件起名字,然后通过名字Resolve

container.Register(
Component.For<IService>().ImplementedBy<Service1>().Named("service1"),
Component.For<IService>().ImplementedBy<Service2>().Named("service2")); var service = container.Resolve<IService>("service2");

使用委托作为组件工厂

container
.Register(
Component.For<IMyService>()
.UsingFactoryMethod(
() => MyLegacyServiceFactory.CreateMyService())
);

UsingFactoryMethod方法使注册更灵活,还有一个UsingFactory方法,文档建议不用

注册组件给多个服务

container.Register(
Component.For<IUserRepository, IRepository>()
.ImplementedBy<MyRepository>()
);

按约定注册组件

BasedOn

container.Register(
Classes.FromThisAssembly()
.BasedOn<SmartDispatcherController>()
.Configure(c => c.Lifestyle.Transient)
); BasedOn 注册所有继承它的组件,解析的时候不能用BasedOn基于的类型,也就是说 container.Resolve<SmartDispatcherController>(); 将会抛异常,使用继承它的组件的类型

WithService.Base()

把最末端的组件注册进去,B继承A,C继承B,把C作为组件注册进去

WithService.DefaultInterfaces()

把最末端并且名字包含接口名字的组件注册进去

WithService.FromInterface()

container.Register(

Classes.FromThisAssembly()

.BasedOn().WithService.FromInterface()

);

举例说明

public interface IService {}

public interface ICalculatorService : IService
{
float Add(float op1, float op2);
} public class CalculatorService : ICalculatorService
{
public float Add(float op1, float op2)
{
return op1 + op2;
}
} IService实际上作为一个标记接口来达到某种效果(没想到有什么用呢),等价于 container.Register(
Component.For<ICalculatorService>().ImplementedBy<CalculatorService>()
); Resolve的时候也是通过类型ICalculatorService获得组件,通过IService会抛异常

WithService.Self()

container.Register(

Classes.FromThisAssembly()

.BasedOn().WithService.Self()

);

举例说明

public interface IService {}

public interface ICalculatorService : IService
{
float Add(float op1, float op2);
} public class CalculatorService : ICalculatorService
{
public float Add(float op1, float op2)
{
return op1 + op2;
}
} public class CalculatorService2 : ICalculatorService
{
public float Add(float op1, float op2)
{
return op1 + op2;
}
} 等价于(实践出真知) container.Register(
Component.For<CalculatorService>(),
Component.For<CalculatorService2>()
);

叠加使用

Classes.FromThisAssembly()
.BasedOn<IFoo>()
.WithService.Self()
.WithService.Base()
等价于
Component.For<IFoo, FooImpl>().ImplementedBy<FooImpl>();

IncludeNonPublicTypes

把abstract、internal、sealed类都给注册进去了,默认是不注册这些类的,使用时请注意

Configure method

container.Register(
Classes.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn<ICommon>()
.LifestyleTransient()
.Configure(component => component.Named(component.Implementation.FullName + "XYZ"))
);

ConfigureFor method

container.Register(
Classes.FromThisAssembly()
.BasedOn<ICommon>()
.LifestyleTransient()
.Configure(
component => component.Named(component.Implementation.FullName + "XYZ")
)
.ConfigureFor<CommonImpl1>(
component => component.DependsOn(Property.ForKey("key1").Eq(1))
)
.ConfigureFor<CommonImpl2>(
component => component.DependsOn(Property.ForKey("key2").Eq(2))
)
);
还没搞明白

ConfigureIf method

container.Register(
Classes.FromThisAssembly()
.BasedOn<ICommon>()
.LifestyleTransient()
.Configure(
component => component.Named(component.Implementation.FullName + "XYZ")
)
.ConfigureIf(
x => x.Implementation.Name.StarsWith("Common"),
component => component.DependsOn(Property.ForKey("key1").Eq(1))
)
);

Castle Windsor Fluent Registration API的更多相关文章

  1. castle windsor学习-----Fluent Registration API 注册

    使用xml配置和fluent注册两种搭配使用需要注意的是: 如果先在WindsorContainer构造函数指明用xml配置进行注册,如下设置 IWindsorContainer container ...

  2. ASP.NET Web API - 使用 Castle Windsor 依赖注入

    示例代码 项目启动时,创建依赖注入容器 定义一静态容器 IWindsorContainer private static IWindsorContainer _container; 在 Applica ...

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

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

  4. Castle Windsor

    让我们从Web API的集成点开始,它们是IDependencyResolver和IDependencyScope接口.IDependencyResolver和其他接口的名称可能与MVC中的接口相同, ...

  5. Castle Windsor常用介绍以及其在ABP项目的应用介绍

    最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...

  6. Aspect Oriented Programming using Interceptors within Castle Windsor and ABP Framework AOP

    http://www.codeproject.com/Articles/1080517/Aspect-Oriented-Programming-using-Interceptors-wit Downl ...

  7. [Castle Windsor]学习依赖注入

    初次尝试使用Castle Windsor实现依赖注入DI,或者叫做控制反转IOC. 参考: https://github.com/castleproject/Windsor/blob/master/d ...

  8. 在ABP项目的应用Castle Windsor

    Castle Windsor常用介绍以及其在ABP项目的应用介绍 最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castl ...

  9. 在ASP.NET MVC中使用Castle Windsor

    平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. ...

随机推荐

  1. 【关于JavaScript】自动计算的实例

    在一些贸易业务Web系统中,某些页面需要提供实时的辅助计算功能,例如:员工录入货物的单价和数量的值,通过JavaScript的事件处理可以直接显示出总价. 如下图所示就是本例的运行效果图: 本例中也采 ...

  2. fixSidebar简介与修正log

    fixSidebar是自己写的一个侧边栏固定小组件,主要是用于主内容较长时让侧边栏能保持显示,依赖于jQuery. Github地址 https://github.com/iRuxu/fixSideb ...

  3. 关于如何设置reduce的个数

    在默认情况下,一个MapReduce Job如果不设置Reducer的个数,那么Reducer的个数为1.具体,可以通过JobConf.setNumReduceTasks(int numOfReduc ...

  4. oracle技巧-持续更新

    1. 登录oracle数据库,执行select status from v$encryption_wallet,如果返回OPEN,表示钱夹已自动打开. 2.

  5. hustoj 1017 - Exact cover dancing link

    1017 - Exact cover Time Limit: 15s Memory Limit: 128MB Special Judge Submissions: 5851 Solved: 3092 ...

  6. 【HTTP】HTTP access control (CORS)

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS Cross-site HTTP requests are H ...

  7. C/C++ 中的0长数组(柔性数组)

    转自C/C++ 中的0长数组(柔性数组) 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的.但是,GUN中却允许使用,而且,很多时候,应用在了 ...

  8. flat ui switch 改变状态而不响应事件

    Flat UI是一套精美的扁平风格 UI 工具包,基于 Twitter Bootstrap实现.这套界面工具包含许多基本的和复杂的 UI 部件,例如按钮,输入框,组合按钮,复选框,单选按钮,标签,菜单 ...

  9. 【转】XCode、Cocoa、Objective-C 的关系区别

    原文网址:http://blog.sina.com.cn/s/blog_5e89e1ff0100z4k1.html Object-Ciphone开发用的编程语言不是c,c++,java 而是objec ...

  10. 【转】ByteBuffer 到底怎么用?网络编程中一点总结!--不错

    原文网址:http://cuisuqiang.iteye.com/blog/1443212 做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读 ...