Fluent IOC 配置/模块的最佳位置(当前正在尝试 Ninject)

2023-11-24

我正在努力寻找放置 Ninject 配置“模块”的最佳位置(指定类型绑定的位置)。我希望我只是错过了一些明显的技巧,因为这开始成为我使用流畅配置(以及 Ninject)的一个障碍:

在一个简单的 Web 堆栈中,包含三个独立的项目:Web、业务逻辑、数据访问。我不希望 Web 层必须直接引用 DataAccess 层,但我看不到解决这个问题的方法,因为:

  • 如果我把数据访问层数据访问配置模块,我必须引用DataAccess层,以便在Web层实例化Ninject Kernel时可以访问配置模块

  • 如果我把Web层的DataAccess配置模块,我必须引用数据访问层才能访问我想要绑定的类型

  • 如果我把单独配置项目中的 DataAccess 配置模块,当我尝试为 Web 层和数据访问层指定绑定时,我最终遇到了循环引用问题。

IOC 的部分好处是允许松散耦合,但据我所知,使用 Ninject 需要我添加目前拥有的更多直接项目引用。我缺少什么?


Ninject 不要求引用程序集!你可以告诉Kernel从程序集中加载与特定模式匹配的所有模块 - 请参阅Load()超载!使用这种机制,您可以将功能公开为模块,正如 @Daniel Marbach 在实现每个功能的地方所建议的那样。我不喜欢这些巨大的模块定义程序集的每个绑定。我宁愿将每个模块都放在一个特定的小模块中以实现特定的功能。

这还允许人们启用/禁用/替换实现,而无需重新编译其他程序集(至少在您的接口位于单独的程序集中的情况下)。

所以基本上你有:

  • 一个或多个 Web 层程序集:包含 Web 层的控制器、视图和绑定。每个程序集都引用一些定义它所依赖的接口的程序集。
  • 定义 Web 层依赖项的接口的一个或多个程序集。
  • 一个或多个业务逻辑程序集实现 Web 层所需的全部或部分接口。引用一些包含它们所依赖的对象的接口的程序集。包含定义它们提供的组件的绑定的模块。
  • 定义业务逻辑层依赖项的接口的一个或多个程序集。
  • 一个或多个程序集,用于实现业务逻辑层以及可能的某些 Web 层的依赖关系(例如,直接提供的数据而不涉及业务逻辑)。包含他们提供的组件的模块。
  • 一个引导程序使用以下方式加载这些程序集的模块kernel.Load("*.dll")或类似的。

这样做的好处是:

  • 从Web层到业务逻辑层和数据层没有引用
  • 业务逻辑层没有到数据层的引用
  • 每一层都可以更换,不会对其他层产生任何影响
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fluent IOC 配置/模块的最佳位置(当前正在尝试 Ninject) 的相关文章

  • 以线程安全的方式获取随机数

    这是一篇描述随机数线程安全性的好文章 以线程安全的方式获取随机数 http blogs msdn com b pfxteam archive 2009 02 19 9434171 aspx 但我坚持使用 RandomGen2 示例 publ
  • 使用编译时编织进行依赖注入? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我只是想了解 PostSharp 老实说我认为它太棒了 但有一件事对我来说很难如何纯依赖注入 不是服务定位器 无法完成 https cod
  • 如何使用 vb.net 将数据插入 Access 表?

    我想在 Access 数据库中插入一个新行 我正在考虑做类似的事情 oConnection new Connection connectionstring oTable oCennection table Orders oRow oTabl
  • 数组与列表的性能

    假设您需要一个需要频繁迭代的整数列表 数组 我的意思是非常频繁 原因可能有所不同 但可以说它位于大容量处理的最内层循环的核心 一般来说 人们会选择使用列表 List 因为它们的大小具有灵活性 最重要的是 msdn 文档声称列表在内部使用数组
  • 生成Excel文件错误

    我在经典 ASP 中使用以下代码生成 Excel 文件 代码很简单并且有效 我在 Windows Vista x86 上的 IIS 7 0 下运行代码 两个问题 有一个奇怪的警告框 这是屏幕快照 http i27 tinypic com 2
  • 在 Javascript 中本地化字符串

    我目前正在使用 resx文件来管理我的 NET 服务器端资源 我正在处理的应用程序还允许开发人员将 JavaScript 插入各种事件处理程序中以进行客户端验证等 对我来说本地化 JavaScript 消息和字符串的最佳方法是什么 理想情况
  • C# 枚举 - 根据掩码检查标志

    我有以下枚举标志 Flags private enum MemoryProtection uint None 0x000 NoAccess 0x001 ReadOnly 0x002 ReadWrite 0x004 WriteCopy 0x0
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 设置 runat=server 时输入名称和 id 发生变化

    在我的表单中 我需要插入 文本 类型的不同输入 输入必须是带有名称和 ID 的 html 控件 因为我将此表单发送到外部网址 对于验证 我在所有输入中执行 runat server 然后我可以使用 requiredfieldvalidato
  • 强制 Mpeg2 解复用器使用 ffdshow 渲染 H 264 数字电视视频

    不幸的是 我花了很多时间尝试使 DirectShow 的 DTVViewer 示例正常工作 但没有成功 DVBT网络的视频格式是H264 我发现IntelliConnect行为IFilterGraph更喜欢使用 Mpeg2 视频格式 对于那
  • DataGridView 中的 C# FormatException

    我创建了一个带有一些列的 DataGridView 订单列仅允许用户输入 int 数字 当我输入 j 例如 时 它会抛出 FormatException 并且我尝试添加 try catch 来解决问题 但它看起来不起作用 private v
  • 将变量作为参数传递与传递另一个函数的返回值时出现“无效过程调用”错误

    我收到错误 无效的过程调用或参数 AddRange 当传递一个变量到ArrayList AddRange https msdn microsoft com en US library zhfwys3c 28v vs 110 29 aspx
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • .NET 内存不足故障排除

    在阅读了几篇有关 NET 技术中的内存的启发性文章后 Out of Memory 不是指物理内存 https learn microsoft com en us archive blogs ericlippert out of memory
  • 为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令

    我正在尝试使用 Renci SSH NET 从 C Web 应用程序连接到远程 Linux 服务器并执行 shell 脚本 我想一个接一个地运行脚本 但不知道如何运行脚本并读取输出并将其存储在标签中 我已经尝试了下面的代码 但无法一行接一行
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • Dagger 2 中“HasFragmentInjector”的实际用法是什么

    我之前已经实现了 dagger2 v2 2 但现在他们也添加了 dagger android 部分 所以我正在用它创建示例项目 我知道旧的方法论 Provide and Modules and 成分等注释 但从 Dagger 2 8 开始

随机推荐