2012-10-29 69 views
3

我有一些通用的接口實現。Castle Windsor解析一個通用接口

interface IBaseInterface<in TObject, out TDetails> 
{ 
    TDetails GetDetails(TObject obj); 
} 

abstract class BaseImpl<TObject> : IBaseInterface<TObject, string> 
{ 
    public abstract string GetDetails(TObject obj); 
} 

class Impl0 : BaseImpl<decimal> 
{ 
    public override string GetDetails(decimal obj) 
    { 
     return "decimal"; 
    } 
} 

class Impl1 : BaseImpl<string> 
{ 
    public override string GetDetails(string obj) 
    { 
     return "string"; 
    } 
} 

class Impl2 : BaseImpl<Details> 
{ 
    public override string GetDetails(Details obj) 
    { 
     return "Details"; 
    } 
} 

class Impl3<TDetail> : BaseImpl<DetailsGeneric<TDetail>> where TDetail : Details 
{ 
    public override string GetDetails(DetailsGeneric<TDetail> obj) 
    { 
     return "GenericDetails"; 
    } 
} 

class Details 
{ 

} 

class Details1 : Details 
{ 

} 

class DetailsGeneric<TDetails> : Details 
{ 

} 

使用WinsdorInstaller類註冊組件

container.Register(AllTypes.From(typeof(Program).Assembly.GetTypes()) 
    .BasedOn(typeof(IBaseInterface<,>)).WithServiceAllInterfaces() 
    .LifestyleTransient()); 

嘗試的決心。最後兩個調用拋出異常,但我希望他們返回申報基本類型

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new WindsorContainer(); 

     container.Install(new WindsorInstaller()); 

     Details("test", container); 

     Details(123m, container); 

     Details(new Details(), container); 

     Details(new DetailsGeneric<Details>(), container); 

     Details(new Details1(), container); // "ComponentNotFound" exception 

     Details(new DetailsGeneric<Details1>(), container); // "ComponentNotFound" exception   
    } 

    static void Details<TType>(TType obj, WindsorContainer container) 
    { 
     var details = container.Resolve<IBaseInterface<TType, string>>().GetDetails(obj); 

     Console.WriteLine(details); 
    } 
} 

我哪裏錯了組件?我可以修復它嗎?

+0

什麼異常? –

+0

ComponentNotFoundException – user1782320

+1

沒有用於支持服務的組件ConsoleApplication10.IBaseInterface'2 [[ConsoleApplication10.Details1,ConsoleApplication10,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null],[System.String,mscorlib,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b77a5c561934e089]]找到了 – user1782320

回答

0

您從我所看到的Details1中沒有任何組件關閉...

+1

我可以使用基類中的組件嗎? 例如,我有一些用於自定義用戶異常的裝飾器,並使用IoC 獲取此類我想從WCF服務裝飾異常,但它們看起來像FaultException (從FaultException中刪除) 也許我只能使用一個類來處理所有FaultExceptions 這可能嗎? – user1782320

相關問題