castle windsor学习-----Registering components one-by-one 注册类型
2024-10-21 05:49:00
1。在容器中注册一个类型
container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
);
2。注册一个非默认的类型(non-default service)
container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
);
不用泛型
// Same result as example above.
container.Register(
Component.For(typeof(IMyService))
.ImplementedBy(typeof(MyServiceImpl))
);
3.注册泛型类型
// Registering a repository for each entity is not needed.
container.Register(
Component.For<IRepository<Customer>>()
.ImplementedBy<NHRepository<Customer>>(),
Component.For<IRepository<Order>>()
.ImplementedBy<NHRepository<Order>>(),
// and so on...
);
// Does not work (compiler won't allow it):
container.Register(
Component.For<IRepository<>>()
.ImplementedBy<NHRepository<>>()
);
// Use typeof() and do not specify the entity:
container.Register(
Component.For(typeof(IRepository<>)
.ImplementedBy(typeof(NHRepository<>)
);
4.配置组件的生命周期
container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
.LifeStyle.Transient
);
默认为单例
5.对同一个服务注册不同的组件
container.Register(
Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
Component.For<IMyService>().ImplementedBy<OtherServiceImpl>()
);
默认采取第一个组件
通过default方法设置默认组件
container.Register(
Component.For<IMyService>().ImplementedBy<MyServiceImpl>(),
Component.For<IMyService>().Named("OtherServiceImpl").ImplementedBy<OtherServiceImpl>().IsDefault()
);
6。注册已有的对象
var customer = new CustomerImpl();
container.Register(
Component.For<ICustomer>().Instance(customer)
);
用已存在的对象注册,则忽略生命周期
7.使用委托作为组件工厂
container
.Register(
Component.For<IMyService>()
.UsingFactoryMethod(
() => MyLegacyServiceFactory.CreateMyService())
);
UsingFactoryMethod 有多个重载
提供kernel和上下文
container.Register(
Component.For<IMyFactory>().ImplementedBy<MyFactory>(),
Component.For<IMyService>()
.UsingFactoryMethod(kernel => kernel.Resolve<IMyFactory>().Create())
);
container.Register(
Component.For<User>().Instance(user),
Component.For<AbstractCarProviderFactory>(),
Component.For<ICarProvider>()
.UsingFactory((AbstractCarProviderFactory f) => f.Create(container.Resolve<User>()))
);
8. OnCreate
有时候需要检查或者改变对象的创建过程,可以使用OnCreate方法实现
container.Register(
Component.For<IService>()
.ImplementedBy<MyService>()
.OnCreate((kernel, instance) => instance.Name += "a")
);
9.组件有特殊的名称
container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
.Named("myservice.default")
);
10.组件的依赖
如果一个组件需要另一个组件来运行,这就是一个依赖,当注册的时候需要明确给定一个组件来重写服务
container.Register(
Component.For<IMyService>()
.ImplementedBy<MyServiceImpl>()
.Named("myservice.default"),
Component.For<IMyService>()
.ImplementedBy<OtherServiceImpl>()
.Named("myservice.alternative"), Component.For<ProductController>()
.ServiceOverrides(ServiceOverride.ForKey("myService").Eq("myservice.alternative"))
); public class ProductController
{
// Will get a OtherServiceImpl for myService.
// MyServiceImpl would be given without the service override.
public ProductController(IMyService myService)
{
}
}
11.给多个服务注册组件
container.Register(
Component.For<IUserRepository, IRepository>()
.ImplementedBy<MyRepository>()
);
用一个组件给一个或多个服务进行注册,例如你有一个类FooBar同时实现了IFoo和IBar接口,你可以配置容器,当两个接口需要时返回同一个实现类型
container.Register(
Component.For<IUserRepository, IRepository>()
.ImplementedBy<MyRepository>()
);
最新文章
- 【温故而知新-Javascript】使用 Ajax(续)
- 李洪强iOS经典面试题129
- POJ 1186 方程的解数
- DIV+CSS布局-固定页面开度布局
- IOS开发中 RunLoop,RunTime
- PAT (Advanced Level) 1080. Graduate Admission (30)
- Charles安装破解及使用
- 使用dropwizard(5)--加入swagger
- 斑马ZPL指令加入如换行、回车等控制符的方法
- CSS常用字体属性(多出的文本隐藏,或者以省略号的形式显示)和背景样式以及背景图的2个不常用属性:background-origin和background-clip
- RandomShuffleQueue
- Numpy 系列(九)- 结构化数组
- [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.1 一维反应流体力学方程组
- NLP:Gensim库之word2vec
- UVA 11488 Hyper Prefix Sets (字典树)
- [九省联考 2018]一双木棋chess
- Package设计1:选择数据类型、暂存数据和并发
- windows常用DLL及作用
- 思科 ISR路由器登录内置交换模块的方式
- HDU 4678 Mine (2013多校8 1003题 博弈)
热门文章
- smarty、smarty格式化、smarty整数、smarty float、smarty各种转换方式、smarty日期转换等等 (转)
- java消息中间件之ActiveMQ初识
- 全站301跳转 PHP
- Java IO、网络编程、NIO、Netty、Hessian、RPC、RMI的学习路线
- php 在linux 用fopen() 函数打开,file_get_contents(),fread()函数 读取 另外一台服务器映射过来的文件 总是返回false,null的情况。
- 修改Liunx服务器SSH端口
- Hibernate: 数据持久层框架
- C# 中安全代码与不安全代码
- CF:Problem 426B - Sereja and Mirroring 二分或者分治
- 素数定理 nefu 117