首页 文章

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

提问于
浏览
6

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

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

  • 如果我把 DataAccess configuration Module in the DataAccess layer ,我必须引用DataAccess层,这样我就可以在Web层实例化Ninject内核时访问配置模块

  • 如果我把 DataAccess configuration Module in the Web tier ,我必须引用DataAccess层才能访问我想要绑定的类型

  • 如果我放了 DataAccess configuration Module in a separate configuration project ,在尝试为web和DataAccess层指定绑定时,我最终会出现循环引用问题 .

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

4 回答

  • 5

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

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

    所以基本上你有:

    • 一个或多个Web层程序集:包含Web层的控制器,视图和绑定 . 每个程序集都引用一些程序集来定义它所依赖的接口 .

    • 一个或多个程序集,用于定义Web层依赖关系的接口 .

    • 一个或多个业务逻辑程序集,实现Web层所需的全部或部分接口 . 引用包含它们所依赖的对象的接口的一些程序集 . 包含定义它们提供的组件的绑定的模块 .

    • 一个或多个程序集,用于定义业务逻辑层的依赖关系的接口 .

    • 一个或多个程序集,它们实现业务逻辑层的依赖关系,并可能实现某些Web层(例如,直接提供业务逻辑的数据) . 包含它们提供的组件的模块 .

    • 一个引导程序使用 kernel.Load("*.dll") 或类似方法加载这些程序集的模块 .

    这样做的好处是:

    • 没有从Web层到业务逻辑层和数据层的引用

    • 没有从业务逻辑层到数据层的引用

    • 每层都可以更换,而不会对其他层产生任何影响

  • 2

    我通常只为IOC容器和配置创建一个程序集;然后,程序集可以引用所有其他程序集和Ninject(或者我的案例中的StructureMap) . 然后Web应用程序只需引用IOC程序集并包含几行直接使用IOC程序集的初始化代码 .

    但需要注意的是 - 我的IOC程序集不引用Web程序集(这将引入循环引用) . 任何需要注入的东西都是在Web组件之外定义的,所以这对我来说不是一个问题 .

  • 0

    组织模块的最佳方法是按功能!例如

    • AuthenticationModule

    • OrderModule

    • CustomerModule

    玩得开心!

  • 3

    我总是把Ninject Modules Configuration放到像Acme.Common这样的独立程序集中,并从Acme.Data,Acme.Domain等引用它 . 所以没有循环依赖,我总是可以在注册中进行一些修改后替换Acme.Common而没有麻烦 .

相关问题