- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在计划进行一些工作,以将Dependency Injection引入当前的大型单片库中,以期使该库更易于单元测试,更易于理解,并且可能更灵活。
我决定使用NInject,我真的很喜欢Nate的座右铭:“做一件事情,做得好”(改述),在DI的背景下,它似乎特别好用。
我现在想知道的是,是否应该将当前的单个大型装配体拆分为多个具有不相交特征集的较小装配体。这些较小的程序集中的某些程序集将具有相互依赖关系,但它们之间的相互依赖关系却远非如此,因为代码的体系结构已经很松散地耦合了。
请注意,这些功能集也不是小事,它们本身也不是很小...它涵盖了客户端/服务器通信,序列化,自定义集合类型,文件IO抽象,通用例程库,线程库,标准日志记录等内容。
我看到一个先前的问题:What is better, many small assemblies, or one big assembly?种解决了这个问题,但是粒度似乎更精细,这使我想知道那里的答案是否仍适用于这种情况?
同样,在接近该主题的各种问题中,一个常见的答案是,“装配过多”装配会导致未指定的“疼痛”和“问题”。我真的很想具体了解这种方法可能带来的不利影响。
我同意在只需要1个组件的情况下添加8个程序集是一件“痛苦的事”,但是对于每个应用程序都必须包含一个大型的整体库也不是完全理想的……加上8个程序集只是您要做的事情一次,所以我对这个论点几乎没有同情心(即使我起初可能会和其他所有人一起抱怨)。
附录:
到目前为止,我还没有找到针对较小的程序集的令人信服的理由,所以我认为我现在将继续进行,好像这不是问题。如果有人能用可验证的事实想到充分可靠的理由来支持它们,那么我仍然会非常有兴趣了解它们。 (我会尽快添加赏金以提高知名度)
编辑:将性能分析和结果移到单独的答案中(请参见下文)。
最佳答案
我将给您一个真实的示例,其中许多(非常)小的程序集的使用产生了.Net DLL Hell。
在工作中,我们有一个庞大的本地开发框架,该框架根深蒂固(.Net 1.1)。除了常用的框架类型管道代码(包括日志记录,工作流,排队等)之外,还存在各种封装的数据库访问实体,类型化的数据集和一些其他业务逻辑代码。我并没有参与该框架的最初开发和后续维护,但确实继承了它的使用。正如我所提到的,整个框架产生了许多小的DLL。而且,当我说很多的时候,我们说的是100以上-而不是您提到的8点左右。更复杂的问题是,这些程序集都经过了简单的签名,版本控制,并出现在GAC中。
因此,快进了几年,随后又进行了许多维护,结果是,对DLL及其支持的应用程序的相互依赖造成了严重破坏。在每台生产机器上,machine.config文件中都有一个巨大的程序集重定向部分,该部分确保无论请求什么程序集,Fusion都会加载“正确的”程序集。这源于重建依赖于已修改或升级的每个依赖框架和应用程序程序集所遇到的困难。 (通常)会竭尽全力确保在修 retrofit 配时不会对装配进行重大更改。装配被重建,并在machine.config中创建了新的或更新的条目。
我要停下来听听巨大的collective吟声和喘息声!
这种特殊情况是不采取行动的后代。确实,在这种情况下,您将陷入一种完全无法维护的情况。我记得我刚开始使用它花了2天的时间就可以针对该框架进行开发,以解决我的机器问题-解决了我的GAC和运行时环境的GAC之间的差异,machine.config程序集重定向,由于编译时版本冲突由于直接引用组件A和组件B而导致错误的引用,或者更可能的版本冲突,但是组件B引用了组件A,但是版本与我的应用程序的直接引用不同。你明白了。
这种特定情况的真正问题是程序集的内容过于精细。而且,这最终导致了相互依存关系的纠结。我的想法是,最初的架构师认为这将创建一个高度可维护的代码系统-只需重建对系统组件的很小的更改。实际上,事实恰恰相反。此外,对于已经在此处发布的一些其他答案,当您达到如此数量的程序集时,加载大量程序集确实会导致性能下降-肯定是在解析过程中,我想,尽管我没有经验证据,但在某些极端情况下,运行时可能会受到影响,特别是在反射可能起作用的情况下-在这一点上可能是错误的。
您可能会鄙视我,但是我相信程序集存在逻辑上的物理分隔-当我在这里说“程序集”时,我假设每个DLL一个程序集。归结为相互依赖。如果我有一个依赖于程序集B的程序集A,我总是问自己是否需要在不使用程序集A的情况下引用程序集B。或者,这种分离是否有好处?通常,查看如何引用程序集通常也是一个很好的指标。如果要将大型库划分为程序集A,B,C,D和E。如果90%的时间引用了程序集A,因此,您始终必须引用程序集B和C,因为A依赖于它们,那么将程序集A,B和C组合在一起可能是一个更好的主意,除非有一个令人信服的论点允许它们保持分离。 Enterprise Library是经典的例子,您几乎总是要引用3个程序集才能使用库的一个方面-但是,对于Enterprise Library,它具有在核心功能和代码之上构建的能力重用是其架构的原因。
看架构是另一个好的指导原则。如果您有一个很好的干净堆叠的体系结构,其中您的程序集依赖项为堆栈形式,请说“垂直”,而不是“web”,当您在各个方向上都具有依赖项时便开始形成“web”,然后分离程序集在功能边界上有意义。否则,请考虑将事物整合为一体或进行重新架构。
无论哪种方式,祝您好运!
关于.net - 许多-'small'组件的特定缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192004/
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!