gpt4 book ai didi

.net - Fluent IOC 配置/模块的最佳位置(目前正在尝试 Ninject)

转载 作者:行者123 更新时间:2023-12-04 14:05:38 26 4
gpt4 key购买 nike

我正在努力寻找找到我的 Ninject 配置“模块”的最佳位置(指定类型绑定(bind)的位置)。我希望我只是错过了一些明显的技巧,因为使用流畅的配置(以及因此 Ninject)这对我来说开始变成一个交易破坏者:

在一个包含三个独立项目的简单 Web 堆栈中:Web、BusinessLogic、DataAccess。我不希望 Web 层必须直接引用 DataAccess 层,但我看不到解决方法,因为:

  • 如果我把 DataAccess层中的DataAccess配置模块 ,我必须引用DataAccess层,以便在Web层实例化Ninject Kernel时可以访问配置模块
  • 如果我把 Web 层中的 DataAccess 配置模块 ,我必须引用 DataAccess 层才能访问我要绑定(bind)的类型
  • 如果我把 单独配置项目中的 DataAccess 配置模块 ,当我尝试为 Web 和 DataAccess 层指定绑定(bind)时,我最终遇到了循环引用问题。

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

    最佳答案

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

    这也允许在不重新编译其他程序集的情况下启用/禁用/替换实现(至少在您在单独的程序集中有接口(interface)的情况下)。

    所以基本上你有:

  • 一个或多个 Web 层组件:包含 Web 层的 Controller 、 View 和绑定(bind)。每个程序集都引用了一些定义它所依赖的接口(interface)的程序集。
  • 为 Web 层的依赖项定义接口(interface)的一个或多个程序集。
  • 一个或多个业务逻辑程序集实现 Web 层所需的全部或部分接口(interface)。引用一些包含它们所依赖的对象的接口(interface)的程序集。包含为它们提供的组件定义绑定(bind)的模块。
  • 为业务逻辑层的依赖项定义接口(interface)的一个或多个程序集。
  • 一个或多个实现业务逻辑层的依赖关系的程序集,可能还有一些 Web 层(例如,在业务逻辑之外直接提供的数据)。包含它们提供的组件的模块。
  • 一个 Bootstrap 使用 kernel.Load("*.dll") 加载这些程序集的模块或类似的。

  • 这样做的好处是:
  • 没有从 Web 层到业务逻辑层和数据层的引用
  • 没有从业务逻辑层到数据层的引用
  • 每一层都是可替换的,不会对其他层产生任何影响
  • 关于.net - Fluent IOC 配置/模块的最佳位置(目前正在尝试 Ninject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5733591/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com