Castle Windsor:如何注册内部实施

时间:2009-12-03 01:08:19

标签: castle-windsor

当IService的所有实现都是公开的时,此注册有效:

AllTypes
    .Of<IService>()
    .FromAssembly(GetType().Assembly)
    .WithService.FirstInterface()

例如:

public interface IService {}
public interface ISomeService : IService {}
public class SomeService : ISomeService {}

解析ISomeService会返回SomeService的实例。

但是如果SomeService类是内部的,则容器会抛出一个异常,指出ISomeService未注册。

那么有没有办法注册公共接口的内部实现?

1 个答案:

答案 0 :(得分:7)

<强> UPDATE2: 虽然我认为这不是一个好主意,但您可以使用以下代码实现这一目标。

AllTypes.FromAssembly(GetType().Assembly)
    .IncludeNonPublicTypes()
    .BasedOn<IService>()
    .WithService.FirstInterface();

<强>更新 这是一个非常合乎逻辑的行为,如果不这样,我会认为这是一个错误。 AllTypes只公开公共类型,因为它假定,如果您将类型设置为内部类型,则表示您出于某种原因而这样做,如果它暴露出来,则可能是安全问题。

另一方面,当你明确地注册类型时,它是有效的,因为Windsor假设,因为你明确要求它使用内部类型,你知道的更好。