castle windsor注册一个通用接口并检索从其间接继承的所有已注册实例

时间:2010-10-15 11:02:20

标签: castle-windsor ioc-container

我有以下结构 -

public interface IBaseInterface<T>
{
}

public interface IChildInterface1<Class1> : IBaseInterface<Class1>
{
}

public interface IChildInterface2<Class2> : IBaseInterface<Class2>
{
}

public class ImplementationClass1 : IChildInterface1<Class1>
{
}

public class ImplementationClass2 : IChildInterface2<Class2>
{
}

我想直接或间接地在程序集中注册实现IBaseInterface的所有类型,所以我希望能够在给定IBaseInterface的情况下注册ImplementationClass1和ImplementationClass2。然后我想根据ChildInterface类的泛型类型定义检索任何具体类型。

我正在注册这样的类型 -

container.Register(
    AllTypes.FromAssemblyContaining<Class1>()
            .BasedOn(typeof(IBaseInterface<>))
            .WithService.Base()
            .Configure(c => c.LifeStyle.Transient)
     );

然后使用

解析类型
var impl = container.Resolve(typeof(IChildInterface1<>))

我希望这能给我一个ImplementationClass1的实例,但是我得到了错误 -

找不到支持服务IChildInterface`1的组件

有人可以弄清楚我做错了什么,这是否是我正在尝试的有效场景?

这是我的整个代码 -

using Castle.MicroKernel.Registration;

namespace complexresolutionioc
{
  class Program
  {
    static void Main(string[] args)
    {
      var container = new Castle.Windsor.WindsorContainer();

      container.Register(
        AllTypes.FromAssemblyContaining<Class1>()
              .BasedOn(typeof(IBaseInterface<>))
              .WithService.AllInterfaces()
              .Configure(c => c.LifeStyle.Transient)
     );

      var thisWorks = container.Resolve<IChildInterface1<Class2>>();
    }
  }

  public interface IBaseInterface<T>
  {
  }

  public interface IChildInterface1<Class1> : IBaseInterface<Class1>
  {
  }

  public interface IChildInterface2<Class2> : IBaseInterface<Class2>
  {
  }

  public class ImplementationClass1 : IChildInterface1<Class1>
  {
  }

  public class ImplementationClass2 : IChildInterface2<Class2>
  {
  }

  public class Class1 { }
  public class Class2 { }

}

给了我这个错误 -

找不到支持服务complexresolutionioc.IChildInterface1`1 [[complexresolutionioc.Class2,complexresolutionioc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]的组件    在Castle.MicroKernel.DefaultKernel.Resolve(服务类型)在C:\ TeamCity的\ buildAgent \工作\ 1ab5e0b25b145b19 \ SRC \ Castle.Windsor \微内核\ DefaultKernel_Resolve.cs:线172    在Castle.Windsor.WindsorContainer.Resolve(服务类型)在C:\ TeamCity的\ buildAgent \工作\ 1ab5e0b25b145b19的\ src \ Castle.Windsor \温莎\ WindsorContainer.cs:889线    在Castle.Windsor.WindsorContainer.ResolveT在C:\ TeamCity的\ buildAgent \工作\ 1ab5e0b25b145b19的\ src \ Castle.Windsor \温莎\ WindsorContainer.cs:978线    at complexresolutionioc.Program.Main(String [] args)在C:\ MyDev \ complexresolutionioc \ complexresolutionioc \ Program.cs:第21行

-ilias

1 个答案:

答案 0 :(得分:1)

您需要提供要解决的封闭泛型类型:

var thisWorks = container.Resolve<IChildInterface1<Class2>>();