当IService的所有实现都是公开的时,此注册有效:
AllTypes
.Of<IService>()
.FromAssembly(GetType().Assembly)
.WithService.FirstInterface()
例如:
public interface IService {}
public interface ISomeService : IService {}
public class SomeService : ISomeService {}
解析ISomeService会返回SomeService的实例。
但是如果SomeService类是内部的,则容器会抛出一个异常,指出ISomeService未注册。
那么有没有办法注册公共接口的内部实现?
答案 0 :(得分:7)
<强> UPDATE2:强> 虽然我认为这不是一个好主意,但您可以使用以下代码实现这一目标。
AllTypes.FromAssembly(GetType().Assembly)
.IncludeNonPublicTypes()
.BasedOn<IService>()
.WithService.FirstInterface();
<强>更新强> 这是一个非常合乎逻辑的行为,如果不这样,我会认为这是一个错误。 AllTypes只公开公共类型,因为它假定,如果您将类型设置为内部类型,则表示您出于某种原因而这样做,如果它暴露出来,则可能是安全问题。
另一方面,当你明确地注册类型时,它是有效的,因为Windsor假设,因为你明确要求它使用内部类型,你知道的更好。