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 多继承选择的更多相关文章

  1. Effective C++(20) 继承与面向对象设计

    本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...

  2. css书写规则总结

    1. JavaScript钩子使用的class不能是css class,要加j或j-前缀 2. 选择器 2.1 css选择器尽量简短,层级要少,最好是1-2层 例如:.nav{} 优于 ul.nav{ ...

  3. Sass浅谈

    对于一名前端开发来说,CSS并不陌生,几乎每天都在和CSS打交道.相处久了就会觉得CSS有些许的机械化,有些许的无趣:就会觉得写CSS很多时候都是在做一些复制粘贴性的工作,布局排版,颜色设置,边框属性 ...

  4. 《day12---异常》

    //91-面向对象-异常-异常的发生和简单应用. /* 异常: java运行时期发生的问题就是异常. Java中运行时的除了异常Exception含有错误Error. 异常:通常发生后可以有针对性的处 ...

  5. MFC学习 标签页与属性页及各常用控件使用

    参考 http://blog.csdn.net/anye3000/article/details/6700023 CTabCtrl: BOOL CTabTestDlg::OnInitDialog() ...

  6. CSS书写规范与理论

    前端体系的变化可谓是日新月异,短短一年时间,从理论.框架.构建工具.甚至开发语言都发生非常大的变化. 随着新项目就即将启动,我抽时间回顾了一下以往项目的前端架构,零零散散产生了许多想法,尽量一一记录下 ...

  7. java基础(三):谈谈java异常的处理

    1.知识点总结 1.1.异常分类 异常就是java中出现的不正常的现象(错误与异常),按照继承的体系结构,可以分类如下 Throwable: 它是所有错误与异常的超类(祖宗类) |- Error 错误 ...

  8. 好程序员web前端分享值得参考的css理论:OOCSS、SMACSS与BEM

    好程序员web前端分享值得参考的css理论:OOCSS.SMACSS与BEM 最近在The Sass Way里看到了Modular CSS typography一文,发现文章在开头部分就提到了OOCS ...

  9. iOS 扩展类方法之category!

    一.category介绍 category可以不修改源代码的基础上扩展新的方法,Category只能用于方法,不能用于成员变量. 二.category创建 Example:我们扩展NSString类新 ...

随机推荐

  1. Sql Server 添加外部程序集基本操作

    简介:有时候Sql Server的内置函数没有那么好用的时候,可以引用一下外部程序集,下面献下丑,做下添加外部程序集操作 1.准备程序,编译出一个MyCLR的DLL. public class CLR ...

  2. Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type

    使用 proxy-target-class="true" 强制配置了 cglib 代理,于是包上面的错误,加入了 asm.jar 报也一样报错. 错误原因是,lib 中有两个cgl ...

  3. 描述Linux系统开机到登陆界面的启动过程(计时2分钟)

    简述: 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核kernel 5.启动init进程 6.读取inittab文件,执行rc.sysinit,rc等脚本 7.启动minge ...

  4. 删除myeclipse下svn用户名和密码

    在不同的操作系统下,操作基本类似. 以win7为例 1.进入c:/Users/[你的用户名]/AppData/Roaming/Subversion/auth目录,删除该目录下的所有文件: 2.重启ec ...

  5. 一个PHP混淆后门的分析

    洒家的朋友的公司的某个站发现最近被上传了一个后门程序.为了取证我们抓取了HTTP请求流量,看到了一堆莫名其妙看似经过混淆的请求,响应也是看似base64的乱码.洒家用了2个小时静态分析了一遍,并写了利 ...

  6. sqlserver 用 RowNumber 分组

    SELECT RECORD.[RECORD_ID] ,RECORD.[WORKFLOW_INFO_ID] ,RECORD.[FORM_CODE] ,RECORD.[APPLY_DATE] ,RECOR ...

  7. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  8. NYOJ-取石子(二)

    取石子(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 小王喜欢与同事玩一些小游戏,今天他们选择了玩取石子. 游戏规则如下:共有N堆石子,已知每堆中石子的数量,并且 ...

  9. POJ3967Ideal Path[反向bfs 层次图]

    Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Descri ...

  10. 线程同步以及yield()、wait()、Notify()、Notifyall()

    一.线程同步 1.线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏. 2.线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对 ...