替换Castle Windsor中的Obsolete AllTypes类

时间:2013-04-26 08:29:49

标签: castle-windsor

我有来自旧城堡的代码

IoC.Container.Register( 
    AllTypes
        .FromAssemblyNamed(a)
        .Pick().WithService.FirstInterface()
        .Configure(o => o.LifeStyle.PerWebRequest));

当我升级到城堡3.2时,我收到此错误:

  

Castle.MicroKernel.Registration.AllTypes'已过时

o.LifeStyle.PerWebRequest 的错误:

  

只有赋值,调用,递增,递减,等待和新对象表达式才能用作语句

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

就像@charleh所说,AllTypes已被Classes取代,因此修复此问题只是一个简单的查找和替换。

实际上,如果你看一下编译器警告它应该说:

  

'AllTypes'已弃用,将在以后的版本中删除。   使用'Classes'静态类(如果你想只注册具体的   class)或'Types'静态类(如果你想注册接口)   或者抽象类)。它暴露了完全相同的方法。

这种变化的原因是AllTypes是谎言 - 它只匹配具体(非抽象)类,所以Classes是一个更好的名称,更好地告诉你它真正做了什么

至于另一个问题,将属性调用更改为方法调用将修复它:

Container.Register(
    Classes.FromAssemblyNamed(a)
        .Pick().WithServiceFirstInterface()
        .Configure( o => o.LifestylePerWebRequest()));

或者更简单,跳过Configure

Container.Register(
    Classes.FromAssemblyNamed(a)
        .Pick().WithServiceFirstInterface()
        .LifestylePerWebRequest());

很少有人知道,但Windsor实际上附带了BreakingChanges.txt文件,其中描述了重大变化以及如何升级。

答案 1 :(得分:1)

第一个问题是AllTypes相当于Classes(我今天早上实际学到了这一点!)

所以而不是

IoC.Container.Register(AllTypes.etc)

使用

IoC.Container.Register(Classes.etc)

不确定另一个,但快速的搜索似乎表明生活方式是可插入的3.2,你可能会错过参考

编辑:

啊:看起来你已经引用了Castle.Windsor dll的客户端构建 - 还有另一个构建针对完整的.NET配置文件,它包含了你需要的类型 - 检查你的引用

PerWebRequest Lifestyle missing in Castle Windsor 3.2