从我刚刚阅读的文章中
表示层和业务层之间是否存在完全分离的挫折?
这个问题实际上来自追踪流程进度(某些指令系列)和相应更新进度条的问题。
现在唯一知道实际进展的人就是流程本身,而且是业务层。因此,如果两个图层都是相互独立的,那么如何在不踩到表示层的域的情况下从业务层内到达进度条?或者至少将进度值返回到表示层?
答案 0 :(得分:8)
恕我直言,关于分离图层的对话错过了一个关键事实:虽然图层需要分离的原因有很多,但这并不意味着他们不能做其他事情让事情变得更加明显。
我们有类似的要求 - 长期运营业务流程的进度条。我们所做的是在业务层代码中定义进度事件。这些事件将在vairous时间调用 - 例如完成百分比 - 并且'某人'订阅它们。在我们的例子中,它是UI层!
所以这些图层是分开的,但“商业”必须明白有人可能想要观看它!
答案 1 :(得分:3)
依赖注入。
IOW你的表示层实现了一些业务层回调接口(因此依赖关系是好的方向:ui-> biz)并在运行时注册到业务组件。在这种情况下,业务组件将进度更新发送到其回调接口,而不关心“谁”正在监听。
答案 2 :(得分:3)
显然,商务层必须知道取得了哪些进展。然后它必须告诉表示层何时进行了演示或表示层必须询问业务层。无论你喜欢什么。
关键是表示层不应该判断已经取得了什么进展,而且商务层不能决定如何向用户提供信息。
此致
答案 3 :(得分:1)
使表示层查询业务层以获取进度状态。
答案 4 :(得分:1)
您应该将“进度条”视为两个独立的逻辑部分。
用户看到的栏是100%的演示文稿,因此所有使其成长的逻辑都应该包含在视图中。
您的业务层可能会暴露“ProgressUpdated”事件,该事件只会触发每X%。
视图将订阅所述事件,并在UI上有意义地显示。
答案 5 :(得分:0)
“内部”层能够在“外部”层中调用代码,只要外层指定回调代码是什么。这可以通过对象,接口,委托或函数指针来表示,具体取决于语言。
void DoSomethingLengthy(string arg1, Action<double> progressCallback)
{
// during the operation
progressCallback(0.5); // halfway
}
DoSomethingLengthy("blah", progress => bar.Value = 100 * progress);
答案 6 :(得分:0)
我发现的另一个是业务层的元数据 - 例如字段长度和数据库中的唯一性 - 是表示层需要了解的内容。
您可以从业务层导出它,也可以将它放在两者共享的公共模块中,但重要的是,最终不要在业务层中复制与数据库字段长度和表示层相同的信息。作为输入约束。