如何在温莎城堡中通过匹配命名空间自动注册?

How to auto register by matching namespace in Castle Windsor?

我在写这篇文章之前检查了很多答案和文章,但我没有成功。 我想注册从 1 个特定接口 IInject

派生的所有 类

我有这样的界面:

public interface IFoo : IInject
{
    string GetOrder();
}

要自动注册 IFoo,我可以这样在 Ninject 中做到这一点:

kernel.Bind(c =>
 c.FromAssembliesMatching("Core.*.dll")
  .SelectAllIncludingAbstractClasses()
  .InheritedFrom<IInject>()
  .BindAllInterfaces());

但在温莎城堡我不能。 如果你必须知道 IInject 接口是一个空接口,只是为了触发自动注册:

public interface IInject
{
   //Nothing in this interface
}

如何在 Castle Windsor 中使用此 MATCHING 或 CONTAINING 模式?

谢谢,

您的问题标题询问的是按名称空间进行匹配,而在问题本身中您询问的是标记界面。

Windsor 两者皆有可能。

在提供答案之前,我强烈建议通读 Windsor's documentation。 Ninject 和温莎在理念上存在一些显着差异,它将帮助您避免将来可能遇到的麻烦。

现在,回到你的问题,如果你想通过命名空间注册,你会做这样的事情:

container.Register(Classes.FromThisAssembly()
    .InSameNamespaceAs<IInject>()
    .WithService.DefaultInterfaces() // or whatever makes sense
    .LifestyleTransient()); // or whatever makes sense

对于通过标记界面注册,你会像这样:

container.Register(Classes.FromThisAssembly()
    .BasedOn<IInject>()
    .WithService.DefaultInterfaces() // or whatever makes sense
    .LifestyleTransient()); // or whatever makes sense

同样,不要只是 copy/paste 代码,还要确保 fully understand what it does here.