Ninject - 如何动态选择一个实现来绑定到接口

2024-01-02

我目前正在使用 Ninject 在 WCF 服务应用程序中创建接口实例。

Bind<IObjA>().To<ObjA>().InRequestScope();
Bind<IObjB>().To<ObjB>().InRequestScope();
Bind<IObjC>().To<ObjC>().InRequestScope();

它工作得很好,但我们将有几个 IObjC 的实现。我有哪些选项可以继续对 IObjA/IObjB 接口进行流畅的实现分配,但允许对 IObjC 进行可配置分配?

我找到了一个SO的相关问题 https://stackoverflow.com/questions/2147798/options-for-wiring-dependencies-with-ninject但我不知道是否可以同时支持流动方法和可配置方法。

例如,我可以对 IObjC 使用 Ninject.extensions.xml,同时继续对 IObjA 和 IObjB 使用上述方法吗?

是否建议对 IObjC 进行条件赋值?这看起来很脏,但同时又显得很简单。

if (condition1)
  Bind<IObjC>().To<ObjC1>().InRequestScope();
else if (condition 2)
  Bind<IObjC>().To<ObjC2>().InRequestScope();

另外,我知道其他框架(如 Castle)支持 XML 配置,但我想继续使用 Ninject。


1 - 您对 IObjC 的绑定与任何其他绑定无关。您在何处、何时或如何绑定其他服务并不重要。

2 - 您可以使用 XML 扩展,但我会问为什么您认为需要它是可配置的。

3 - 您的条件有 2 种可能性。首先,您希望在启动时做出决定,以确定是在应用程序的整个生命周期中使用 ObjC1 还是 ObjC2。如果是这样,那么您的代码就可以了。但是,如果您想在每次解析绑定时动态决定使用哪个对象,则需要将条件放入绑定中,如下所示:

Bind<IObjC>().ToMethod( ctx => condition ? ctx.Kernel.Get<ObjC1>() : ctx.Kernel.Get<ObjC2>() );

或者,您可以使用命名绑定:

Bind<ILog>().ToConstant( LogManager.GetLogger( "Accounting" ) ).Named( "Accounting" );

或“何时”条件来帮助:

Bind<ILog>().ToConstant( LogManager.GetLogger( "Background" ) ).When( context => context.Target != null && context.Target.Name == "backgroundLogger" );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ninject - 如何动态选择一个实现来绑定到接口 的相关文章

随机推荐

  • 我应该使用对象初始值设定项还是构造函数? [复制]

    这个问题在这里已经有答案了 我刚刚了解了对象初始值设定项 并且想知道何时使用它们的最佳实践是什么 这是我读到的关于他们的内容 http msdn microsoft com en us library vstudio bb384062 as
  • 如何隐藏图像按钮?

    我有 1 个 imageButton 我想在 oncreate 方法中 5 秒后隐藏该按钮 谁能帮帮我吗 onCreate new SleepTask execute private class SleepTask extends Asyn
  • 从 C# POCO 类代码生成 Winforms 表单

    是否已经在某处编写了一些开源代码 该代码将接受具有属性和验证属性的类 并输出带有与这些属性相对应的控件的 Windows 窗体 例子 public bool IsRed get set 产生一个带有Is Red label public i
  • Silverlight:如何设置验证工具提示的样式?

    我做了一些搜索 但这不是我要找的 那么 有谁知道如何在 Silverlight 中设置验证工具提示的样式 绿色边框中的东西 替代文本 http img689 imageshack us img689 222 validationtoolti
  • 获取CPU或主板序列号?

    我正在尝试获取CPU serial or motherboard serial using C or Python出于许可目的 是否可以 我在用着Linux 在 Linux 下 您可以使用 lshw quiet xml 并解析其输出 您将在
  • keras 和 tf.keras 模型之间的兼容性

    我有兴趣在 tf keras 中训练模型 然后用 keras 加载它 我知道这不是强烈建议 但我有兴趣使用 tf keras 来训练模型 因为 tf keras 更容易构建输入管道 我想利用 tf dataset API 我有兴趣用 ker
  • 为 Spring Boot 实现字节服务

    我想使用 Spring Boot Rest API 在 Angular 中实现视频播放器 我可以播放视频 但无法进行视频搜索 每次当我使用 Chrome 或 Edge 时 视频都会一遍又一遍地开始 我尝试了这个端点 RequestMappi
  • PHP PDO 获取 MySQL 日期时间

    我有一个代表 MySQL 表的 PHP 类 其中一种列表类型是DateTime 以前我使用字符串并且一切正常 因为我不必处理日期类型 我只是用fetchAll函数和列表自动映射到适当的字段 stmt gt execute results s
  • 使用 GAE Python 第二代在本地运行

    我已经使用 GAE P 第一代很多年了 现在正在跳转到我的第一个 GAE P 第二代项目 我正在尝试像我一样在本地运行它dev appserver py对于第一代应用程序 但是the docs https cloud google com
  • 在 OpenCV 上使用 SVM 训练图像

    我正在尝试对图像进行分类 下一步我将根据特征进行分类 但现在只想尝试我是否做得对 这是我的代码 include
  • AspectJ:自定义 *.aj 文件被忽略

    Why aspectj maven plugin忽略我的AnnotationInheritor aj文件 是我配置有问题吗 我想提建议ItemRepository getById带有自定义注释 Repository public inter
  • 从 Visual Studio 控制台运行解决方案,无需打开 IDE

    我在用视觉工作室2010 http en wikipedia org wiki Microsoft Visual Studio Visual Studio 2010 SP1 我首先尝试的是这样的 从开始菜单打开 Visual Studio
  • SQL OVERLAPS 运算符问题,如何解决

    我预计从 2011 01 28 到 2011 02 01 的日期期间与 2011 02 01 到 2011 02 01 的日期期间重叠 这里是同一天 但确实如此不是 PostgreSQL 期望精确结束点的匹配不是匹配 如何摆脱这个 我希望将
  • 如何使用加载的 SVG 模块

    我已经设置了 webpack 将 SVG 文件加载到 create react app 的 TSX 端口中 按照这个答案 https stackoverflow com a 44718847 1399272 const logo requi
  • CSS:悬停时背景从下到上填充:

    请看一下这个例子 https www outsideonline com 2317131 wilma rudolph worlds fastest woman https www outsideonline com 2317131 wilm
  • 嵌套片段在过渡动画期间消失

    场景如下 Activity 包含片段A 这又使用getChildFragmentManager 添加片段A1 and A2 in its onCreate像这样 getChildFragmentManager beginTransactio
  • ADO.NET 实体框架和 ASP.MVC 的组合是否有可能是错误的?

    我有一个包含三个项目的解决方案 DomainModel 带有 ADO NET 实体框架的 C 库 DomainModelTest 业务逻辑单元测试 Web 应用程序 使用域模型 由于某种原因 如果我传递 DomainModel 中的任何对象
  • 使用 OpenCV 识别 HSV 中颜色的范围

    我正在使用 Python 中的 OpenCV 来识别黄色 我已经到了这一步 我必须定义黄色的下限和上限范围HSV https en wikipedia org wiki HSL and HSV 定义蓝色范围的示例 lower blue np
  • 为什么 Set 不实现 PartialFunction?

    Scala 编程 综合分步指南 第二版 第 546 页 在 Iterable 下面的继承层次结构中 您会发现三个特征 Seq 设置和地图 这三个特征的一个共同点是它们都 通过 apply 和 isDefinedAt 实现 PartialFu
  • Ninject - 如何动态选择一个实现来绑定到接口

    我目前正在使用 Ninject 在 WCF 服务应用程序中创建接口实例 Bind