C# Castle Windsor解析通用接口
我有一些实现的通用接口C# Castle Windsor解析通用接口,c#,generics,castle-windsor,C#,Generics,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); } cl
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
{
}
接口IBaseInterface
{
t详细信息(TObject obj);
}
抽象类BaseImpl:IBaseInterface
{
公共抽象字符串GetDetails(TObject obj);
}
类Impl0:BaseImpl
{
公共重写字符串GetDetails(十进制对象)
{
返回“十进制”;
}
}
类Impl1:BaseImpl
{
公共重写字符串GetDetails(字符串obj)
{
返回“字符串”;
}
}
类Impl2:BaseImpl
{
公共重写字符串GetDetails(详细信息obj)
{
返回“详细信息”;
}
}
类Impl3:BaseImpl,其中TDetail:Details
{
公共重写字符串GetDetails(DetailsGeneric obj)
{
返回“GenericDetails”;
}
}
课程详情
{
}
类详细信息1:详细信息
{
}
类详细信息通用:详细信息
{
}
对寄存器组件使用WinsdorInstaller类
container.Register(AllTypes.From(typeof(Program).Assembly.GetTypes())
.BasedOn(typeof(IBaseInterface<,>)).WithServiceAllInterfaces()
.LifestyleTransient());
container.Register(AllTypes.From(typeof(Program).Assembly.GetTypes())
.BasedOn(typeof(IBaseInterface)).with服务接口()
.生活方式(暂时的);
试着下决心。最后两个调用抛出异常,但我希望它们返回为基类型声明的组件
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);
}
}
类程序
{
静态void Main(字符串[]参数)
{
var container=新的WindsorContainer();
容器。安装(新WindsorInstaller());
详细信息(“试验”,容器);
详细信息(123m,集装箱);
详细信息(新详细信息(),容器);
详细信息(新的详细信息generic(),容器);
详细信息(新的详细信息1(),容器);/“ComponentNotFound”异常
详细信息(新的详细信息generic(),容器);/“ComponentNotFound”异常
}
静态无效详细信息(t类型obj,WindsorContainer容器)
{
var details=container.Resolve().GetDetails(obj);
控制台写入线(详细信息);
}
}
我错在哪里?我可以修复它吗?据我所见,您没有关闭任何组件
详细信息1
。没有支持服务控制台应用程序10.IBaseInterface`2[[ConsoleApplication10.Details1,ConsoleApplication10,Version=1.0.0,Culture=neutral,PublicKeyToken=null],找到[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]我可以使用基类中的组件吗?例如,我有一些自定义用户异常的修饰符,并使用IoC获取此类,我希望从WCF服务中装饰异常,但它们看起来像FaultException(FaultException中的descandant)也许我只能用一个类来处理所有的故障异常,有可能吗?