Castle Windsor:如何在实现特定接口时注册多种类型?

时间:2014-04-23 18:37:47

标签: c# dependency-injection castle-windsor

已更新

我有以下类/接口:

public interface IFoo
{
    (...)
}

public interface IFoo<T> : IFoo
{
    (...)
}

public abstract BaseFoo<T> : IFoo<T>
{
    (...)
}

public Bar : BaseFoo<ConcreteType1>
{
    (...)
}

public Baz : BaseFoo<ConcreteType2>
{
    (...)
}

使用Castle Windsor,如何将Bar和Baz类型注册为实现IFoo?

我已经尝试过类似的失败:

Register(Types.FromAssembly(typeof (IFoo).Assembly)
        .BasedOn<IFoo>()
        .WithService
        .Select(new List<Type> { typeof(IFoo)})
        .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));

1 个答案:

答案 0 :(得分:2)

编辑:评论中说明的异常表明抽象类BaseFoo正在尝试解决。这是因为您使用Types选择所有组件,甚至是抽象类。避免这种情况的一种简单方法是使用没有此问题的Classesdocumentation州:

  

我应该使用类或类型吗?

     

有两种方法可以开始   按惯例登记。其中一个是使用Classes静态类,   就像上面的例子一样。其次是使用类型静态类。他们   两者都暴露出完全相同的方法。他们之间的区别是,   类型将允许您注册所有(或者确切地说,如果您   使用来自给定程序集的默认设置,所有公共类型,即   类,接口,结构,委托和枚举。关于的课程   另一方面预先过滤类型以仅考虑非抽象类型   类即可。大多数情况下,Classes是您将使用的,但类型可以   在一些高级场景中非常有用,比如注册   基于界面的打字工厂。


这段代码看起来是正确的 - 实际上我尝试了三个不同的WithService来电(Base AllInterfacesSelect)并且每一个都成功了。我认为这可能是您选择的第一部分可能不正确:Types.FromAssembly(typeof (IFoo).Assembly)

我没有找到任何方法来获取城堡在尝试使用流畅注册时所考虑的列表,但您可以使用Configure来记录所考虑组件的名称:

c.Register(Classes.FromAssemblyInThisApplication()
    .BasedOn<IFoo>()
    .Configure(x => Console.WriteLine(x.Implementation.Name)) // classes names
    .WithService.Select(new Type[] {typeof(IFoo)})
    .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));

因此,请尝试检查您是否正在使用正确的程序集,或者您的类是否对容器可见

修改

此代码有效:

public interface IFoo
{
}
public interface IFoo<T> : IFoo
{
}
public abstract class BaseFoo<T> : IFoo<T>
{
}
public class Bar : BaseFoo<Bar>
{
}
public class Baz : BaseFoo<Baz>
{
}
// main
var c = new Castle.Windsor.WindsorContainer();
c.Register(Classes.FromAssemblyInThisApplication()
            .BasedOn<IFoo>()
            .Configure(x => Console.WriteLine(x.Implementation.Name))
            .WithService.Select(new Type[] {typeof(IFoo)})
            .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));
var all = c.ResolveAll<IFoo>(); // 2 components found