- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读了几篇我的 Mark Seeman 关于依赖注入(inject)的文章,特别是避免服务定位器模式的原因:
Service Locator 存在问题的基本思想是它可能在运行时失败:
public class OrderProcessor : IOrderProcessor
{
public void Process(Order order)
{
var validator = Locator.Resolve<IOrderValidator>();
if (validator.Validate(order))
{
var shipper = Locator.Resolve<IOrderShipper>();
shipper.Ship(order);
}
}
}
var orderProcessor = new OrderProcessor();
// following line fails at compile time if you
// forget to register all necessary services - and
// you don't have a way of knowing which services it needs
orderProcessor.Process(someOrder);
但这意味着 Composition Root 不仅必须在启动时解析所有 依赖关系,而且实际上实例化整个对象图,否则我们仍然不知道所有必要的依赖关系都已注册:
private static void Main(string[] args)
{
var container = new WindsorContainer();
container.Kernel.Resolver.AddSubResolver(
new CollectionResolver(container.Kernel));
// Register
container.Register(
Component.For<IParser>()
.ImplementedBy<WineInformationParser>(),
Component.For<IParser>()
.ImplementedBy<HelpParser>(),
Component.For<IParseService>()
.ImplementedBy<CoalescingParserSelector>(),
Component.For<IWineRepository>()
.ImplementedBy<SqlWineRepository>(),
Component.For<IMessageWriter>()
.ImplementedBy<ConsoleMessageWriter>());
// Everything must be resolved AND instantiated here
var ps = container.Resolve<IParseService>();
ps.Parse(args).CreateCommand().Execute();
// Release
container.Release(ps);
container.Dispose();
}
这在实际应用中的可行性如何?这是否真的意味着您不应该在构造函数之外的任何地方实例化任何东西?
(附加信息)
假设您有一项服务应该处理来自某种类型的多个测量设备(不同的连接类型、协议(protocol)或同一协议(protocol)的不同版本)的传入连接。每当您获得新连接时,服务都应该从输入端口构建一个“管道”,通过 fifo 缓冲区,到许多特定于该设备类型的解析器,以多个消费者结束各种解析消息。
提前组合这些对象图在应用程序启动时似乎是不可能的。即使它可以延迟,我仍然看不出如何获得对象图构造将失败的早期(-er)指示。
这似乎是 main problem with service locators ,我不知道如何避免它:
In short, the problem with Service Locator is that it hides a class' dependencies, causing run-time errors instead of compile-time errors, as well as making the code more difficult to maintain because it becomes unclear when you would be introducing a breaking change.
最佳答案
But this means that the Composition Root must not only resolve all dependencies at startup, but actually instantiate the entire object graph
如果你申请Pure DI (即应用依赖注入(inject)模式,但没有 DI 容器)您将获得开箱即用的编译时支持。对于 DI 容器,您必须在运行时进行这些检查,但这并不意味着您必须在启动期间进行这些检查,尽管我认为这是首选。因此,如果在启动时检查容器的配置不会导致性能问题,那么您应该这样做。否则,您可以将此验证步骤移至单元测试。
How feasible is this in a real world application?
这是完全可行的。我构建的大型应用程序通常在容器中注册了数百到一千多个服务,并且我始终验证(和 diagnose)我的容器配置,这可以防止许多常见的配置错误,这些错误很容易犯,而且很难追踪。
Does this really mean you are not supposed to instantiate anything anywhere outside the constructor?
负责创建服务的是您的组合根;这本身并不意味着所有服务都应在启动期间创建,因为您可以将部分对象图的创建延迟到运行时。然而,我更喜欢的工作方式是使所有注册服务成为单例(一个实例用于应用程序期间)。这使得在应用程序启动期间创建所有服务变得非常容易(而且成本低廉),并迫使您进入一个更严格的模型,在该模型中,SOLID 违规和其他 DI 不良做法会更快弹出。
关于c# - DI 组合根 : how does it ensure compile-time resolution checking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33364761/
WPF 文档和教程指出 WPF 与分辨率无关,据我所知,它会在不同分辨率(1600x1200 -> native 和 1024x768)和/或 DPI 设置下显示相同大小的窗口。但是,当我尝试示例应用
对于我的应用程序,我分析了 Kinect v2 的空间分辨率。 为了分析空间分辨率,我记录了一个垂直平面到给定距离的平面,并将平面的深度图转换为点云。然后我通过计算欧几里得距离将一个点与他的邻居进行比
有没有办法在 Android 上的 OpenGL ES 2.0 中将场景渲染为正常分辨率,然后将屏幕的另一部分渲染为较低分辨率? 如果我使用 GLES20.glViewPort() 并更改分辨率,它不
使用 CameraX.LensFacing.FRONT 时出现此错误, 在模拟器上测试 E/AndroidRuntime: FATAL EXCEPTION: main Process: met
我没有使用Firebase,这似乎是other问题的原因people 这是错误的屏幕截图: 这是我的依赖项列表: dependencies { implementation project('
我正在按照教程 (link) 将图像上传到 Firebase 数据库,但出现以下错误。我重新检查了 gradle 依赖项并启用了 multidex 支持,但错误仍然存在 java.lang.NoC
我正在尝试使用 durandal,但出现此错误: 错误: bower requirejs extra-resolution Unnecessary resolution: requirejs#~2.2
我的应用程序被苹果拒绝了,原因是“iPhone 应用程序还必须在 iPad 上运行而无需修改,iPhone 分辨率和 2X iPhone 3GS 分辨率”。Apple 建议“为了支持 iPad 3GS
我在我的网站上显示用户的gravatr图像。我怎么知道要使用的最佳高分辨率?例如哪个参数应该是“ s”。 https://secure.gravatar.com/avatar/?s=250 当然,这取
我正在开发一个网站,但我不知道“支持”的最低分辨率应该是多少。我知道它可以在所有分辨率下运行,但“支持”是指所有内容都适合页面而不需要左右滚动。我是否应该考虑“支持”1024x768? 最佳答案 除了
有谁知道ImageNet中图片的分辨率数据集? 抱歉,我在他们的网站或任何 papers 中都找不到它。 . 最佳答案 图像的尺寸和分辨率各不相同。许多应用程序将所有图像的大小调整/裁剪为 256x2
我已经陷入了这个问题:我需要使用 DPI=1200 和特定的打印尺寸来绘制图像。 默认情况下 png 看起来不错... png("test.png",width=3.25,height=3.25,un
我有一个包含 16.000 个条目的测量数组,形式为 [t] [value] 问题是我的数据记录器太慢了,我每秒只有测量点。对于我的模拟,我需要增加伪分辨率。这样每个时间步都除以 1000,每个测量值
我正在尝试使用“分辨率”媒体查询来确定屏幕的实际 DPI。 我正在做的代码是这样的: window.matchMedia(`(resolution: ${value}dpi)`).matches 但我
我正在开发一款支持多种分辨率的应用。我已经通过了http://developer.android.com/guide/practices/screens_support.html但找不到解决方案。 决
我已经从 GitHub 中提取了文件。现在我需要创建一个合并冲突。 如何在 GitHub 上故意创建合并冲突? 最佳答案 在两个分支中编辑同一行,并尝试合并 Merge conflicts in gi
有什么方法可以更改分辨率或为亚马逊 Kindle 键盘上的屏幕设置不同的边界?我的屏幕有一部分出现裂纹,我想解决这个问题。 我试过在文件系统中乱搞(通过 WiFi 连接),但我的所有属性更改都没有任何
This question already has answers here: Closed 11 years ago. Duplicate: Recommended website resoluti
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 6年前关闭。
我在网站的几个部分中使用了 tinyscrollbar 插件。到目前为止,它运行良好。但现在由于某种原因,鼠标滚轮可以滚动,但拖放 slider 不能滚动。 我使用的分辨率是 1360x768,但我在
我是一名优秀的程序员,十分优秀!