【问题标题】:Ninject BindingNinject 绑定
【发布时间】:2009-08-07 15:45:26
【问题描述】:

如何将我的接口绑定到不同程序集中的具体类?

我的解决方案中有以下项目:

Foo.Data
Foo.Domain

在 Structure Map 中,我将我的两个程序集名称添加到 StructureMap.config 文件中,然后使用 PluginFamily 和 Pluggable 属性将我的接口映射到我的具体类。

如何用 Ninject 完成同样的事情?

【问题讨论】:

  • 解决方案中的项目是否同时包含接口和具体类?您是希望将它们绑定到消耗性解决方案/项目中还是在此解决方案本身中?
  • 另外,您使用的是哪个版本的 Ninject?
  • @Peter 接口在我的域中,具体类在数据层中。我只是想在解决方案中绑定。我也在考虑,而不是按项目分离域和数据层,而是在同一个项目的单独文件夹中进行。我将 Ninject 1.0 用于紧凑的框架。

标签: c# ninject


【解决方案1】:

我在这里做几个假设。

  1. 您的 Foo.Domain 项目中有一个名为 IBar 的接口,并且您的 Foo.Data 项目中有一个名为 BarClass 的具体类。
  2. 实际上,您在 Foo.Data 项目中引用了 Foo.Domain 项目,因为 BarClass 实现了 IBar。

使用 Ninject 做的最简单的事情是在 Foo.Data 中创建一个派生自 Ninject 的 StandardModule 的新类:

internal class BarModule : StandardModule {
  public override void Load() {
    Bind<IBar>()
      .To<BarClass>();
  }
}

然后这个类为 IBar 的请求建立到 BarClass 的具体类的绑定。这是您的 XML 等价物。

下一步是创建 Ninject 内核(又名“容器”)并向其提供此模块(即此配置)。您在哪里执行此操作很大程度上取决于您正在创建什么样的应用程序。一般而言,您通常会在代码的逻辑入口点或“启动”部分配置内核。如果它是控制台或 Windows 桌面应用程序,这可能是 main() 函数首先要做的事情之一。

代码如下:

var modules = new IModule[] {
                              new BarModule()
                            };

var kernel = new StandardKernel(modules);

此时,当你做这样的事情时:

var barObj = kernel.Get<IBar>()

变量 barObj 引用 BarClass 的一个实例。

总而言之,我很可能无法完全了解您的应用程序的所有细微差别——例如程序集是动态加载的,等等。希望这对您有所帮助。

【讨论】:

  • 聚会有点晚了,但这是一个非常可靠的回应,谢谢彼得。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多