Castle Windsor解析泛型接口

3

我有一个通用接口和一些实现。

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());

尝试使用resolve。 最后两个调用抛出了异常,但我期望它们返回为基本类型声明的组件。
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);
    }
}

我哪里做错了?我能修复它吗?


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
1个回答

0

从我所看到的情况来看,您没有任何封闭在Details1中的组件...


1
我可以使用基类中的组件吗? 例如,我有一些用于自定义用户异常的装饰器,并且使用IoC获取这些类 我想要装饰来自WCF服务的异常,但它们看起来像FaultException<TDetails>(从FaultException派生) 也许我可以只使用一个类来处理所有FaultExceptions 这是可能的吗? - user1782320

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接