1

在写这篇文章之前我检查了很多答案和文章,但我没有成功。我想注册从 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
}

如何在温莎城堡中使用这种匹配或包含模式?

谢谢,

4

1 回答 1

2

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

温莎都可以。

在提供答案之前,我强烈建议您通读Windsor 的文档。Ninject 和 Windsor 之间存在一些重大的哲学差异,它将帮助您避免将来可能出现的头痛。

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

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

同样,不要只是复制/粘贴代码,而是要确保你完全理解它在这里的作用。

于 2018-09-14T10:59:32.183 回答