使用 Ninject 注入实现相同接口的不同类

2024-01-05

我正在实现构建器设计模式来构造要在 WPF UI 上显示的不同类型的图形对象。我使用 Ninject 作为我的 IOC 容器。然而,我正在尝试找到一个优雅的可扩展解决方案。

我有一个ChartDirector需要一个对象IChartBuilder作为依赖。我也有TemperatureChartBuilder and ThresholdChartBuilder实施IChartBuilder。我想注射TemperatureChartBuilder OR ThresholdChartBuilder to ChartDirector取决于触发的事件或取决于客户端调用。我在下面的代码中说明了我的问题。

// ChartDirector also depends on this
kernel.Bind<IExample>().To<Example>();

// when called in Method X...
kernel.Bind<IChartBuilder>().To<TemperatureChartBuilder>();

// when called in Method Y...
kernel.Bind<IChartBuilder>().To<ThresholdChartBuilder();

// TemperatureChartBuilder is a dependency of ChartDirector, need a way to dynamically
// allocate which binding to use.
var director = kernel.Get<ChartDirector>();

// without Ninject I would do
var director = new ChartDirector(new TemperatureChartBuilder);

// or
var director = new ChartDirector(new ThresholdChartBuilder);

EDIT:

结合加里的回答,并注意到 ChartDirector 有另一个依赖项的轻微编辑,我现在想做这样的事情:

var director = kernel.Get<ChartDirector>().WithConstructorArgument(kernel.Get<IChartBuilder>("TemperatureChart"));

这样的事情可能吗?


如果您只是计划使用服务位置(如示例中所示),那么根据 Garys 的回答,命名绑定可以正常工作。

然而,更好的方法是使用构造函数注入并使用属性。例如,来自 ninject wiki:

Bind<IWeapon>().To<Shuriken>().Named("Strong");
Bind<IWeapon>().To<Dagger>().Named("Weak"); 

...

class WeakAttack {
    readonly IWeapon _weapon;
    public([Named("Weak")] IWeapon weakWeapon)
        _weapon = weakWeapon;
    }
    public void Attack(string victim){
        Console.WriteLine(_weapon.Hit(victim));
    }
}

根据您对加里的评论,您(奇怪的是)陷入了与我几个小时前提出的问题类似的领域。请参阅雷莫的回答:使用 WithConstructorArgument 并创建绑定类型 https://stackoverflow.com/questions/8580071/

您可以使用 When 条件来定义何时创建正确的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ninject 注入实现相同接口的不同类 的相关文章

  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我

随机推荐

  • 如何使用 sed 删除最后一个字符?

    也就是说 从ABCD gt ABC 你可以试试 sed s 使用的正则表达式是 是要匹配的正则表达式元字符 任何内容 换行符除外 是线锚点的末端 通过使用 我们强迫 匹配最后一个字符 这将删除最后一个字符 无论是什么 echo ABCD s
  • 如何将参数从pythonoperator任务传递到airflow dag中的simplehttpoperator任务?

    我想触发一个简单的httpoperator 如下所示 气流trigger dag test trigger conf name something 然后我使用 pythonoperator python callable 通过使用 kwar
  • iPhone 在延迟后调用函数

    我有一些代码 可以将精灵显示 N 秒 N 秒后该框将被删除 我想调用一个我可以选择的函数 例如 10秒后我想调用showBoxEnded 我看了这里 发现我可以使用SEL功能 我写 void caller id sender NSLog F
  • Async() 与线程在性能和控制上的比较

    我正在看GoingNative 2012 第 1 天演讲 C 11 风格 作者 Bjarne Stroustrup https www youtube com watch v m0H5bUPfwn8 从 1 05 13 开始 他似乎在宣传a
  • 将图像从 iPhone 上传到 ImageShack 帐户的简短代码示例

    我正在尝试将 jpg 图像从 iPhone 上传到我的 ImageShack com 帐户 大家都说要用 MASSIVE数千第 3 方 ASI 代码中的代码行数 有没有一个简单的例子 只是上传代码 我将采用同步或异步 这不是应该用 25 行
  • React 错误:Firefox 中“SharedArrayBuffer 未定义”

    我有一个用 create react app 创建的 React 应用程序 我也使用 jsdom NPM 包 由于某种原因 应用程序在加载时抛出错误仅在火狐浏览器中 在 Chrome 和 Edge 中运行良好 这是错误 ReferenceE
  • Boost ASIO套接字读取N个字节不多不少并等待它们到来或超时异常?

    创建一个简单的TCP服务器examples http www boost org doc libs 1 43 0 doc html boost asio examples html但仍然不知道如何创建一个可以读取一定数量字节的套接字 如果没
  • 使用 MSBuild.exe 通过 cmd 行“发布”ASP.NET MVC 4 项目

    我正在寻找一个命令来运行MSBuild exe它只需要一个 MVC 4 项目并将其发布到给定的目录 例如 MSBuild
  • javascript 或 css 中的圆角文本区域框

    谁能建议我用 javascript 或 css 制作圆角文本区域框 执行此操作的 经典 方法是在文本区域周围的 div 上使用背景图像 并将文本区域的边框 轮廓设置为无 如下所示 div style background image url
  • 从推文中过滤图像

    我对 tweepy 很陌生 我想知道如何追踪和存储用户在他 她的推文中发布的图像 我在教程中找到了几种获取用户推文的方法 但我找不到仅过滤图像的方法 我使用以下代码来获取用户推文 怎么可能只获取用户图像 编辑 我像上面一样编辑我的代码 au
  • 有人创建过可在 3D 显示器上运行的 3D 网站吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我偶然发现了这个网站http www swell3d com http www swell3d com
  • CSS3 转换和过渡 (Webkit)

    考虑以下fiddle http jsfiddle net 6TMcS p webkit transform translate 100 0 moz transform translate 100 0 ms transform transla
  • google swiffy在同一页面多次调用runtime.js时出错

    我已经使用 google swiffy v5 2 转换了多个 swf 文件 并将在许多不同的页面上显示我的新动画 其中大多数页面我无法控制或访问 为了使动画正常工作 它需要 swiffy 的 runtime js 文件 该文件在页面上可能如
  • click() 在 jQuery 的 document.ready 中分配

    在 document ready 单击 fn 具体来说 适用于与选择器匹配的新附加元素 如果没有 我怎样才能将它分配给这个新元素 我是否必须在每次追加后写作业还是有更好的方法 您正在寻找live http docs jquery com E
  • 使用javascript将父窗口的CSS添加到子窗口

    我正在尝试生成一个弹出窗口 其中包含主窗口一小部分的可打印版本 我使用的是 Meteor 因此 HTML 和 CSS 文件都是以编程方式生成的 我想做的是使用 Javascript 读取父窗口中所有链接的 CSS 文件并将它们附加到子窗口
  • 如何查找包含给定字符串的文件的树的提交 SHA1

    情况是这样的 我在 git 存储库中丢失了一些工作 这项工作曾经提交过 但现在被埋藏在我的历史中 git log all 可能无法到达的地方 我唯一记得的是一些不同的字符串 它可以精确定位我此时工作的一部分的文件 我有一个解决方案 但它很长
  • 如何在 Ruby 中将 Base64 图像发送到 Google Cloud Vision API 标签检测?

    您好 我正在用 Ruby 构建一个程序来为网页上的图像生成 alt 属性 我正在抓取图像页面 然后将其 src 即 URL 发送到 google cloud vision 以进行标签检测和其他 Cloud Vision 方法 每张图像大约需
  • 链接服务器的 OLe DB 提供程序“SQLNCLI”无法开始分布式事务

    我试图在 SQL Server 2008 中调用存储过程并将获取的数据存储到本地临时表中 当我尝试运行它时 我收到以下错误 由于 OLe DB 提供程序 SQLNCLI 操作无法完成 链接服务器无法开始分布式事务 我的代码如下 create
  • 从文本字符串中删除网址

    这是 能做到吗 的问题之一 我有一位同事联系我 要求从数据库文本字符串中删除网址 除了以 http 开头之外 所有网址都是唯一的 我的第一反应是使用替换功能 但这可能会变得使用和维护起来非常麻烦 因此 我在论坛上询问他们对如何最好地完成这项
  • 使用 Ninject 注入实现相同接口的不同类

    我正在实现构建器设计模式来构造要在 WPF UI 上显示的不同类型的图形对象 我使用 Ninject 作为我的 IOC 容器 然而 我正在尝试找到一个优雅的可扩展解决方案 我有一个ChartDirector需要一个对象IChartBuild