Castle 多继承选择
Castle 多继承选择
很多时候,我们定义了一个接口,但是这个接口会有多种不同的,这时IOC构造函数注入的时候,就需要自动选择对应的实现。
public interface ITestService {}
public class TestService : IService
{
public string test()
{
return "test"
}
}
public class TestService_New : ICalculatorService
{
public string test()
{
return "test new";
}
}
此时,我们大多数情况下,需要用TestService来实现ITestService,但是少部分情况下,需要用TestService_New实现ITestService。
解决方案一
IOC中只实现需要用到的类:
Component.For<ITestService>()
.ImplementedBy<TestService>()
如果在某些地方部署时,修改为
Component.For()
.ImplementedBy<TestService_New>()
这样每次部署的时候都需要修改代码,而且需要手写的规则会越来越多。
解决方案二
参考了Castle的WIKI,发现了可以ServiceOverrides重写实现:
Component.For<ITestService>()
.ImplementedBy<TestService>()
.Named("myservice.default"),
Component.For<ITestService>()
.ImplementedBy<TestService_New>()
.Named("myservice.new"),
Component.For<TestController>()
.ServiceOverrides(ServiceOverride.ForKey("myService").Eq("myservice.new"))
尝试了一下,VS提示改方法已过世,建议使用Dependency.OnComponent代替。
Component.For().
.DependsOn(Dependency.OnComponent<ITestService, TestService_New>())
修改代码之后,怎么都不起作用。重新翻看官方WIKI,发现了IsDefault方法,当多个类实现同一个接口时,可以通过IsDefault来置为默认实现。
解决方案三
//先通过DefaultInterfaces加载正常实现
Classes.FromAssembly(assembly)
.IncludeNonPublicTypes()
.BasedOn<IApplicationService>()
.WithService.DefaultInterfaces()
.LifestyleTransient()
.Configure(c =>
{
c.Interceptors<ExceptionInterceptor, TransactionInterceptor>();
c.Named(c.Implementation.Name);
}),
//根据WEBCONFIG加载特殊实现,并设置为默认实现
Classes.FromAssembly(assembly)
.IncludeNonPublicTypes()
.BasedOn<IApplicationService>()
.WithService.Select((type, @base) =>
type.GetAllInterfaces()
.Where(i => type.Name.Contains(GetInterfaceNameFromConf(i))))
.LifestyleTransient()
.Configure(c =>
{
c.Interceptors<ExceptionInterceptor, TransactionInterceptor>().IsDefault()
.Named(c.Implementation.FullName + "_" + ConfigurationManager.AppSettings["City"]);
})
private string GetInterfaceNameFromConf(Type @interface)
{
var name = @interface.Name;
if ((name.Length > 1 && name[0] == 'I') && char.IsUpper(name[1]))
{
return name.Substring(1) + "_" + ConfigurationManager.AppSettings["City"];
}
return name;
}
OK,大功告成。
Castle 多继承选择的更多相关文章
- Effective C++(20) 继承与面向对象设计
本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...
- css书写规则总结
1. JavaScript钩子使用的class不能是css class,要加j或j-前缀 2. 选择器 2.1 css选择器尽量简短,层级要少,最好是1-2层 例如:.nav{} 优于 ul.nav{ ...
- Sass浅谈
对于一名前端开发来说,CSS并不陌生,几乎每天都在和CSS打交道.相处久了就会觉得CSS有些许的机械化,有些许的无趣:就会觉得写CSS很多时候都是在做一些复制粘贴性的工作,布局排版,颜色设置,边框属性 ...
- 《day12---异常》
//91-面向对象-异常-异常的发生和简单应用. /* 异常: java运行时期发生的问题就是异常. Java中运行时的除了异常Exception含有错误Error. 异常:通常发生后可以有针对性的处 ...
- MFC学习 标签页与属性页及各常用控件使用
参考 http://blog.csdn.net/anye3000/article/details/6700023 CTabCtrl: BOOL CTabTestDlg::OnInitDialog() ...
- CSS书写规范与理论
前端体系的变化可谓是日新月异,短短一年时间,从理论.框架.构建工具.甚至开发语言都发生非常大的变化. 随着新项目就即将启动,我抽时间回顾了一下以往项目的前端架构,零零散散产生了许多想法,尽量一一记录下 ...
- java基础(三):谈谈java异常的处理
1.知识点总结 1.1.异常分类 异常就是java中出现的不正常的现象(错误与异常),按照继承的体系结构,可以分类如下 Throwable: 它是所有错误与异常的超类(祖宗类) |- Error 错误 ...
- 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM
好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...
- iOS 扩展类方法之category!
一.category介绍 category可以不修改源代码的基础上扩展新的方法,Category只能用于方法,不能用于成员变量. 二.category创建 Example:我们扩展NSString类新 ...
随机推荐
- 烂泥:学习Nagios(二):Nagios配置
本文由秀依林枫提供友情赞助,首发于烂泥行天下 nagios安装完毕后,我们现在就来配置nagios.有关nagios的安装,可以参考<烂泥:学习Nagios(一):Nagios安装>这篇文 ...
- x01.Excel: 合计件数
由于 VBA 与 Excel 是耦合的,所以还是先看表: 件数的计算,用 Mod 即可.但考虑到要求码洋.数量等多种需求,就该 VBA 登场了.代码如下: '===================== ...
- CCommandManager 类
CCommandManager类 CCommandManager 类管理命令及其与图像的关联.描述CCommandManager :: CleanUp从命令列表和全局和用户映射中删除所有元素.CCom ...
- 浅谈 Linux 内核无线子系统
浅谈 Linux 内核无线子系统 本文目录 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理路径 6. 数据包又是如何被接收? 7. 总结一下 L ...
- 【分享】4412开发板ubuntu 12.0.4播放音乐没有声音解决方法
转自迅为论坛:http://bbs.topeetboard.com 准备工作 1.下载 vim 在命令行上输入 apt-get install vim 下载 vim 2.输入 vim /etc/hos ...
- linux下yum命令出现Loaded plugins: fastestmirror
yum install的时候提示:Loaded plugins: fastestmirror fastestmirror是yum的一个加速插件,这里是插件提示信息是插件不能用了. 不能用就先别用呗,禁 ...
- [转]C#网络编程(异步传输字符串) - Part.3
本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part3.aspx 这篇文章我们将前进一大步,使用异步的方式 ...
- 【Python数据分析】从Web收集数据小实例
最近在看<鲜活的数据:数据可视化指南>,学习一些数据可视化与数据分析的技术,本例是该书第一章的一个例子衍伸而来. 实例内容:从www.wunderground.com收集美国纽约州布法罗市 ...
- Ahead-of-time compilation(AOT)
Ahead-of-time (AOT) compilation is the act of compiling a high-level programming language such as C ...
- Maven与Ant使用reportNG代替testng
大家在使用TestNG时一定会发现其本身的报告生成不但简陋而且相当的不美观,而ReportNG正是一款为TestNG量身定做的报告生成插件,其报告美观.简约.清晰.漂亮的特点让很多TestNG开始慢慢 ...