【问题标题】:Bind all concrete implementations by name in Ninject在 Ninject 中按名称绑定所有具体实现
【发布时间】:2014-01-27 09:16:47
【问题描述】:

我有一个接口IAdapdor,以及几个具体的实现。使用 Ninject 3.0,我将它们全部按名称绑定:

IKernel kernel = new StandardKernel();

kernel.Bind<IAdapdor>().To<Adaptor1>().Named("Adaptor1");
kernel.Bind<IAdapdor>().To<Adaptor2>().Named("Adaptor2");
...

如何使用Ninject conventions extension 实现这一目标?

更具体地说,我正在寻找以下内容:

kernel.Bind(x => x.FromThisAssembly()
                  .SelectAllClasses()
                  .InheritedFrom<IAdapdor>()
                  .BindByClassName()); // <-- BindByClassName() does not really exist

【问题讨论】:

  • 我很想知道这个约定是什么……因为我没有看到。 Conventions 扩展并不能解决所有问题……有时您需要显式绑定。
  • @Simon Whitehead - 据我了解,我应该能够通过约定在一行中做到这一点。我将编辑问题以反映这一点。

标签: c# ninject ninject-extensions


【解决方案1】:

您可以使用Configure method 自定义约定创建的绑定。因此,您可以使用它向Named 注册您的绑定:

kernel.Bind(x => x
    .FromThisAssembly()
    .SelectAllClasses().InheritedFrom<IAdapdor>()
    .BindAllInterfaces()
    .Configure((b, c) => b.Named(c.Name)));

【讨论】:

  • ..这是否考虑到数字因素?
  • c.Name 将获得您的类型名称,因此 Adaptor1Adaptor2。但是你根据注册的类型写下你得到"Adaptor1""Adaptor2"的任何东西
  • @nemesv,马上!我知道这应该很简单......谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多