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) 的相关文章

  • 如何使用温莎城堡注册通用装饰器?

    我需要装饰一切基于ICommandHandler
  • 变量替换为字符串

    我可以做类似的事情吗 s said s blah name blah 在 VB NET 中 写字越来越痛苦name said blah blah 在VB NET 14 对于VS2015 中 您可以使用字符串插值 https msdn mic
  • 有没有办法将消息从 C#.NET 程序集(ActiveX)发送到 VB6 应用程序?

    本问答参考并可用于以下用途 目的 通过ActiveX dll从IE浏览器发送消息到vb6应用程序 从 ActiveX dll 向 vb6 应用程序发送消息 从 C net dll 发送消息到 vb6 应用程序 我读过了本文 http www
  • 在同一项目中同时使用 AddDbContextFactory() 和 AddDbContext() 扩展方法

    我正在尝试使用新的DbContextFactory中讨论的模式EF Core 文档的 DbContext 配置部分 https learn microsoft com en us ef core dbcontext configuratio
  • 如何防止在 ActiveX 方法调用期间重新进入 WPF 事件处理程序?

    我们从 WPF 和 STA 应用程序中调用 ActiveX 组件上的方法 此调用是通过以下方式后期绑定执行的 res ocx GetType InvokeMember methodName flags null ocx args 其中 oc
  • 尝试使用 VS 2012 打开我的 asp.net 4.5 MVC Web 应用程序时出错。Asp.net 尚未在服务器上注册

    我有一个Windows Server 2012 R2 Visual Studio 专业版 2012 现在我用来开发 ASP NET 4 5 MVC 4 Web 应用程序 没有任何问题 但现在当我尝试打开该项目时 我会收到此错误 如果我单击
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • DataTable.GetChanges() 不断返回 NULL

    我正在尝试获取存在于的所有行allData但不在removeData public static DataTable RemoveDuplicateRows DataTable allData DataTable removeData re
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • WCF服务健康状况监控

    我刚刚实现了 WCF 服务 目前正在研究服务监控选项 我们的服务器团队目前仅托管 java 服务 希望我们的实例始终运行 因此它可以在该实例的生命周期内收集数据 他们表示将使用我们的 webmon 操作之一来获取统计信息 但我们正在使用每次
  • 如果 async-await 不创建任何额外的线程,那么它如何使应用程序响应?

    一次又一次 我看到它说使用async await不创建任何额外的线程 这是没有意义的 因为计算机看起来一次做不止一件事的唯一方式是 实际上一次做不止一件事 并行执行 利用多个处理器 通过调度任务并在它们之间切换来模拟它 做一点A 一点B 一
  • Foursquare - OAuth 身份验证 - .Net 示例

    是否有关于如何使用 Oauth 向 Foursquare 进行身份验证的示例 这里有一个关于如何将 OAuth 与 Foursquare 结合使用的非常好的工作流程摘要 http developer foursquare com docs
  • 使用 Amazon SQS 的 .net 应用程序示例

    我正在寻找一个示例 Net 应用程序 该应用程序会持续检查 Amazon SQS 是否有新消息 并在发现新消息时执行一项操作并将其从队列中删除 我的目标是让一个在 EC2 上运行的应用程序监视我的 SQS 队列中的新消息 当找到一条消息时
  • 如何将 Razor 视图转换为字符串?

    我想使用我的 Razor 视图作为某种发送电子邮件的模板 所以我想将我的模板 保存 在视图中 将其作为字符串读入控制器 进行一些必要的替换 然后发送它 我有有效的解决方案 我的模板作为 HTML 页面托管在某处 但我想将其放入我的应用程序中
  • 用 C# 编写插件或插件框架

    我正在用 C 编写一个 Addin 框架 我想知道如何使 Addin 可以卸载而无需重新启动应用程序 我听说过 AppDomains 但是它们是如何工作的呢 外接程序是否可以添加可扩展性类并通过接口在主应用程序域中调用 并且仍然可卸载并调用
  • 如何使用 .NET 以编程方式沙箱进程

    我计划设计一个系统 本质上允许用户在我的机器上运行 PHP Ruby 等脚本代码 我想将它们放入沙箱中 以防止它们访问机器的关键方面 哪些 NET API 可用于此目的 我计划从主流程创建一个子流程 并希望以编程方式从主流程中沙箱该子流程
  • 使用远程管理凭据将文件复制到远程计算机

    我正在使用 C 我需要能够将一组文件复制到大约 500 台不同的计算机上 我已成功地使用 LogonUser 方法来模拟具有复制文件所需权限的域帐户 文件的目标路径类似于 远程计算机 C SomeFolder 我的问题是 有没有办法做到这一
  • Inno Setup:验证是否已安装 .NET 4.0

    我有一个需要 NET 4 0 才能运行的组件 我的 Inno Setup 安装程序如何验证它是否已安装 如果没有 则提示用户安装它 The InitializeSetup运行 Inno Setup 可执行文件时调用该函数 为自定义脚本插入此
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会

随机推荐