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类新 ...
随机推荐
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- android setLayoutParams 问题,出错
LinearLayout layt = (LinearLayout) rootView.findViewById(R.id.llt_2); FrameLayout.LayoutParams layou ...
- [转]ion-slide-box
本文转自:http://ionicframework.com/docs/api/directive/ionSlideBox/ The Slide Box is a multi-page contain ...
- 《Writing Idiomatic Python》前两部分的中文翻译
汇总了一下这本小书前两部分的内容: 翻译<Writing Idiomatic Python>(一):if语句.for循环 翻译<Writing Idiomatic Python> ...
- POJ 2826 An Easy Problem?! --计算几何,叉积
题意: 在墙上钉两块木板,问能装多少水.即两条线段所夹的中间开口向上的面积(到短板的水平线截止) 解法: 如图: 先看是否相交,不相交肯定不行,然后就要求出P与A,B / C,D中谁形成的向量是指向上 ...
- Vijos1053 Easy sssp[spfa 负环]
描述 输入数据给出一个有N(2 <= N <= 1,000)个节点,M(M <= 100,000)条边的带权有向图. 要求你写一个程序, 判断这个有向图中是否存在负权回路. 如果从一 ...
- 创建简单的机器人模型smartcar
前面我们使用的是已有的机器人模型进行仿真,这一节我们将建立一个简单的智能车机器人 smartcar,为后面建立复杂机器人打下基础. 一.创建硬件描述包. cd ~/catkin_ws/srcroscr ...
- row_number()over(partition by 字段 order by 字段)ID,修改重复行的字段值。
案例分析: 现在要查询一个表单里面的运费结果,但是他还有分录,为了显示分录,必须把表头显示出来,问题是,他要查询运费的合计, 但是这样就会导致重复行也加进去了,这样显然数据不准,为此,可以把重复的行设 ...
- Python的高级特性7:闭包和装饰器
本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...
- div+css兼容 ie6_ie7_ie8_ie9_ie10和FireFox_Chrome等浏览器方法
1.div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了.缺点是要控制内容不要换行 ...