2011-10-26 172 views
1

我想註冊類型按照慣例註冊一個通用的抽象類,我已經簡化我的情況下,在這個例子中:在溫莎城堡

public abstract class BaseEntity{} 

public class EntityA : BaseEntity{} 

public class EntityB : BaseEntity{} 

public abstract class BaseClass 
{ 
    //... 
} 

public abstract class GenericBaseClass<T> : BaseClass where T : BaseEntity 
{ 
    //.. 
} 

public class ConcreteA : GenericBaseClass<EntityA> 
{ 
    //... 
} 

public class ConcreteB : GenericBaseClass<EntityB> 
{ 
    //... 
} 

我試圖找到註冊GenericBaseClass的方式當請求GenericBaseClass<EntityA>時返回ConcreteA。當試圖解決這個問題,我得到一個異常說是這樣的:在試圖讓 類型GenericBaseClass`1的情況下,關鍵的「」

激活出錯如果我改變的定義GenericBaseClass<T>從抽象類的接口,這個註冊代碼的工作:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>() 
     .BasedOn(typeof(GenericBaseClass<>)) 
     .WithService.FirstInterface()); 

不過,我需要因爲我需要寫的這裏面的代碼中使用抽象類。 我可以手動註冊每個ConcreteX類,但它不會很有幫助。

我試過這個:

container.Register(AllTypes.FromAssemblyContaining<BaseClass>() 
     .BasedOn(typeof(GenericBaseClass<>)) 
     .WithService.Base()); 

調試,我可以看到的類型不添加到容器。

我正在使用Castle Windsor 2.6。

謝謝。

+0

沒有溫莎2.6。你的意思是2.5.4嗎? –

回答

0

這工作:

container.Register(AllTypes.FromAssemblyContaining<ConcreteA>() 
        .BasedOn(typeof (GenericBaseClass<>)) 
        .WithService.Base()); 

如果你看到沒有被加入到容器類型確保你掃描正確的組件(其中包含實現類型,而不是服務類型之一)。

+1

無法按照您的建議工作。這工作,但我必須添加相同的代碼爲任何ConcreteX類型:container.Register( Component.For(typeof(GenericBaseClass )) .ImplementedBy(typeof(ConcreteA)) .Named(「ConcreteA」) ); – Hero

+0

爲什麼不呢?這正是我的代碼所做的(名稱部分除外) –

+0

@Hero,你的解決方案爲我工作,我有一個抽象基類和2個實現。我已經有了相同的代碼,但是缺少.Named(「...」)部分來區分使用相同服務的兩個組件註冊。謝謝! – kzfabi