温莎城堡解决通用接口 [英] Castle Windsor resolving a generic interface

查看:136
本文介绍了温莎城堡解决通用接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些实现通用接口

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类组件

Using WinsdorInstaller class for register components

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

尝试的决心。最后两个电话抛出异常,但我希望他们返回申报基本类型

Try resolve. Last two calls throwing exceptions, but I expect that they return components declared for base types

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



我哪里错了?并能解决这个问题?

Where i am wrong? and can I fix it?

推荐答案

您不必关闭了点评详情任何组件从我所看到的...

You don't have any component closed over Details1 from what I can see...

这篇关于温莎城堡解决通用接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆