2009-12-03 61 views
3

時IService的所有的實現都是公開的該登記工作:溫莎城堡:如何註冊內部實現

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

例如:

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

解決ISomeService返回SomeService的一個實例。

但是,如果SomeService類是內部的,容器將引發異常,指出ISomeService未註冊。

那麼是否有任何方法來註冊公共接口的內部實現?

回答

5

UPDATE2: 雖然我認爲這不是一個好主意,但可以用下面的代碼來實現。

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

UPDATE: 這是一個非常合理的行爲,我會認爲這是一個錯誤,如果它在其他方面。 AllTypes只公開公共類型,因爲它假設,如果你將你的類型設爲內部類型,那麼出於某種原因,如果它暴露了它,它可能是一個安全問題。

另一方面,當你明確地註冊類型時,它會起作用,因爲溫莎假設,因爲你明確要求它使用內部類型,所以你知道的更好。


+0

我不明白。如果我使用Component.For .ImplementedBy (),一切正常。只有當我使用AllTypes時,我纔有這個問題。還要注意,在這種情況下的註冊是在與實現相同的程序集中完成的。這兩個事實不應該足以讓內核找到內部類型嗎? – shovavnik 2009-12-03 15:05:11

+0

將城堡稱爲友善集會似乎也很奇怪。 – shovavnik 2009-12-03 15:10:06

+0

當你使用Component.For註冊時,你在代碼所在的程序集的上下文中。 AllTypes.Of在Castle組件的上下文中執行。 – 2009-12-03 16:00:54