在多层应用程序中定位 Ninject 模块的位置

2023-11-25

我的应用程序包括许多后端程序集(包括实体框架数据存储库层),它们由许多前端程序集(包括 Windows 服务和 MVC3 Web 应用程序)共享。

我对 Ninject 绑定过程的理解是,每个包含可注入类型的程序集还应该包含一个定义这些类型的默认绑定的 Ninject 模块。然后,定义的模块集将被加载到使用程序集的 Ninject 内核中。

但是,我遇到了问题,因为所需的绑定范围并不总是一致的。例如,我的MVC项目需要绑定到数据上下文InRequestScope,而 Windows 服务绑定到同一个类InThreadScope.

显然,我可以通过将所有模块重新定位到前端项目中来解决这个问题,从而为每个使用场景维护每个模块的单独副本,但这似乎很麻烦,因为它在多个项目中复制了大部分模块内容。

是否有关于模块应位于多层应用程序中的位置的最佳实践,以及如何将其与绑定项目之间差异的需求相协调?

非常感谢您的建议,

Tim


对于单个应用程序的解决方案,一般建议是在应用程序项目(您的 Web 应用程序或 Web 服务项目)中注册您的容器。对于 Web 应用程序,这通常是 Global.asaxApplication_Start。将所有东西连接在一起的地方称为成分根在 DI 术语中。

使用多应用程序解决方案,每个应用程序项目仍然有一个组合根。这是必须的,因为每个应用程序都有其独特的配置。另一方面,重复的代码总是不好的。当您引入新的抽象时,您不希望必须更改三个地方。

诀窍是将所有注册在项目层次结构中向下移动。例如,您可以定义一个依赖于业务层程序集(及以下)的“引导程序集”,并让它拥有那些不更改的程序集的所有注册。然后,应用程序的组合根可以使用该程序集来获取默认注册,并使用应用程序特定的依赖项对其进行扩展。

这样的事情可能看起来像这样:

// MVC Composition root
public static void Bootstrap()
{
    var container = new Container();

    // Default registrations
    BusinessLayerBootstrapper.Bootstrap(container);

    // Application specific registrations
    container.Bind<IUserContext>().To<AspNetUserContext>();

    DependencyResolver.Current = 
        new ContainerDependencyResolver(container);
}

// Windows Service Composition root
public static void Bootstrap()
{
    var container = new Container();

    // Default registrations
    BusinessLayerBootstrapper.Bootstrap(container);

    // Application specific registrations
    container.Bind<IUserContext>().To<SystemUserContext>()
        .SingleScoped();

    // Store somewhere.
    Bootstrapper.Container = container;
}

// In the BL bootstrap assembly
public static class BusinessLayerBootstrapper
{
    public static void Bootstrap(Container container)
    {
        container.Bind<IDepenency>().To<RealThing>();
        // etc
    }
}

尽管您不需要单独的引导程序程序集(您可以将此代码放置在 BL 本身中),但这使您可以使业务层程序集免受容器的任何依赖。

另请注意,我只是调用静态Bootstrap()方法,而不是使用 (Ninject) 模块。我试图让我的答案独立于框架,因为你的问题很笼统,并且对于所有 DI 框架的建议都是相同的。不过,如果您愿意,当然可以使用 Ninject 模块功能。

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

在多层应用程序中定位 Ninject 模块的位置 的相关文章

随机推荐

  • Angularjs:控制器被多次调用

    由于某种原因 当我在资源 1 和资源 2 之间切换时 我的控制器被双重调用 这是代码 索引 html
  • EditText在设备旋转后自动保存值

    我在 Android Studio 中创建了一个示例应用程序来了解 Android 应用程序的生命周期 我知道方向改变会完全重新启动活动 即再次调用 OnCreate 方法 据我所知 方向改变应该会破坏上下文并在设备旋转后显示空白文本 但不
  • 如何将类属性声明为类名的联合?

    我正在阅读电子表格寻找不同的结构 当我使用 Moose 尝试以下操作时 它似乎做了我想要的事情 我可以创建不同类型的对象 将其分配给找到的成员 并转储 Cell 实例以供审查 package Cell use Moose use Moose
  • Grunt - 监视文件并在文件更改时进行 SFTP

    我正在尝试自动上传 css文件 当它从 Sass 编译时 这就是我的Gruntfile js module exports function grunt Project configuration grunt initConfig pkg
  • 如何调用系统命令并捕获其输出?

    有没有办法调用系统命令 例如ls or fuser在铁锈中 捕获它的输出怎么样 std process Command允许这样做 有多种方法可以生成子进程并在计算机上执行任意命令 spawn 运行程序并返回一个包含详细信息的值 output
  • 无法解析指针:/definitions/Error-ModelName

    我是 Swagger io 的新手 也是 Spring Fox 的新手 我遇到的问题是 由于某种原因 一个对象没有正确引用其模型 The error in the UI 错误是因为 JSON 中的结果如下 schema ref defini
  • Android 真的没有 wchar_t 吗?

    我建立了一个简单的方法 如下所示 wchar t buf 1024 void logDebugInfo wchar t fmt va list args va start args fmt vswprintf buf sizeof buf
  • 使用 JAX-RS 创建 RESTful Web 服务并将其部署到 tomcat

    我正在尝试使用 JAX RS 创建和部署 RESTful Web 服务并将其部署到 tomcat 我不想使用任何 IDE 在 Tomcat 中 我在 webapps 中有以下目录结构 notifire WEB INF gt web xml
  • 显示所有表的所有数据

    我想显示数据库中的所有数据而不编写select对于每个表 我该怎么做 我不想这样做 select from Customer select from Employee select 我正在将 TSQL 与 MSSQL Server 一起使用
  • 在 Swift 中添加和减去时间

    我用伪代码编写了其中一些内容 因为我不知道它的语法 我想要timeLeftLabel text反映 6 小时结束前还剩多少小时 分钟和秒 我最大的问题是我不知道如何加减时间 谁能帮我 var timer NSTimer func timer
  • 如何在 Primefaces DataTable 中使用 Font Awesome(或其他字体图标)而不是 jQuery sprite?

    我正在使用 PrimeFaces 生成数据表 默认的排序图标是 JQuery 库中的 V 形图标 但由于它们不是 Vector 因此看起来很难看 我不想使用像 font Awesome 这样的字体来替换它们 但我不知道如何做到这一点 我可以
  • 如何将 SolrQuery(SOLRJ) 转换为 URL?

    在使用 SOLRJ 时 我想知道如何使用 SOLR 查询语法将 SolrQuery 对象转换为其 URL 表示形式 我尝试使用 toString 方法 但它没有返回正确的查询表示 还有其他方法吗 我建议ClientUtils toQuery
  • 从您的应用程序启动 Facetime?

    我发现您可以通过以下方式从您的应用程序启动 FaceTime UIApplication sharedApplication openURL NSURL URLWithString facetime tel number 我还读到 由于没有
  • 拼接后计算源图像的坐标

    我使用 opencv 的全景拼接算法 将 2 或 3 个图像拼接成一个新的结果图像 我有每个源图像中的点的坐标 我需要计算结果图像中这些点的新坐标是什么 我在下面描述该算法 我的代码类似于示例 缝合 详细 来自 opencv 分支 3 4
  • 数组的 N 重分区,每个分区的总和相等

    给定一个整数数组a 两个数N and M 返回N一组整数从a使得每个组的总和为M 例如 说 a 1 2 3 4 5 N 2 M 5 然后算法可以返回 2 3 1 4 or 5 2 3 或者可能是其他人 我在这里可以使用什么算法 Edit 我
  • 在 iOS 中的 Instagram 上与图像共享文本

    在我的应用程序中 我在 Instagram 上分享了一张图片 它在我的应用程序中运行良好 我正在使用以下代码 property nonatomic retain UIDocumentInteractionController dic CGR
  • ASPNET Boilerplate,扩展审核日志

    我正在尝试延长AuditLog实体在ASPNET样板框架 以便向其添加一些新属性 我曾尝试延长AuditLog class ExtendedAuditInfo 并实现一个定制版本AuditStore Class ExtendedAuditS
  • 如何在 C# 中列出 .zip 文件夹的内容?

    如何在 C 中列出压缩文件夹的内容 例如 如何知道压缩文件夹中包含多少个项目 以及它们的名称是什么 NET 4 5 或更高版本最终具有处理通用 zip 文件的内置功能System IO Compression ZipArchive clas
  • 禁用 Internet Explorer 8 开发人员工具

    有没有办法禁用 Internet Explorer 8 开发人员工具 或者至少更改快捷键映射 我正在开发一个 ASP NET AJAX 应用程序 该应用程序多年来一直使用 F12 键来实现某个功能 它实际上是原始 DOS 应用程序的保留 客
  • 在多层应用程序中定位 Ninject 模块的位置

    我的应用程序包括许多后端程序集 包括实体框架数据存储库层 它们由许多前端程序集 包括 Windows 服务和 MVC3 Web 应用程序 共享 我对 Ninject 绑定过程的理解是 每个包含可注入类型的程序集还应该包含一个定义这些类型的默