首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将松散耦合和扩展设计与可能的异步实现结合起来?

如何将松散耦合和扩展设计与可能的异步实现结合起来?
EN

Stack Overflow用户
提问于 2013-05-30 11:33:57
回答 1查看 239关注 0票数 2

我是一个使用.Net 4.0开发项目的程序员,并试图找出将松散耦合和可扩展的设计与相同的逻辑操作有时异步执行,有时仅同步执行的最佳方法(每个支持异步的实现都支持同步,而不是反过来)。在这个项目中,每个这样的逻辑操作都由一个接口来表示(松散耦合和扩展性要求很高)。让我们把我的问题集中在一个特定的接口上:IDataDictLoader。这个接口负责加载一个名为DataDict的对象。该接口有两种可能的实现:一种称为LocalDataDictLoader,它使用本地dll并同步执行操作(返回DataDict),另一种称为WebServiceDataDictLoader,它使用web服务并执行LocalDataDictLoader(返回Task<DataDict>) 或同步操作。配置文件中的值确定要创建的实现--如果值为"Local“,则创建LocalDataDictLoader,如果值为"WebService”,则创建WebServiceDataDictLoader。在函数IDataDictLoader CreateLoader(string configValue)中,创建部分使用由约定指导的反射。调用该函数并使用该接口的代码不知道前面的实现是什么,即使它想知道它也无法访问配置值。问题是如何设计接口?到目前为止,我想到了许多选择:

  1. 在接口上有两个方法,一个同步和一个异步,并在LocalDataDictLoader中为同步版本设置异步包装。正如Stephen 这里所建议的那样,这不是一个推荐的解决方案。
  2. 按照Josh对这里问题的回答所建议的那样,在他的IIMViewModelDL示例中,接口将有一个带回调参数的void方法。虽然该解决方案将对客户端代码隐藏实现细节,但在我看来,它具有异步调用语义,使用回调。在我看来,这相当于总是返回一个Task<DataDict>,并让同步实现同步地完成加载,然后使用TaskCompletionSource<DataDict>重新调整已完成的任务。由于同样的原因,这与备选案文1是错误的。
  3. 将接口拆分为两个接口:IDataDictLoader用于同步,IAsyncDataDictLoader : IDataDictLoader用于异步和同步。该解决方案为客户端代码提供了知识,如果操作可以异步执行或不同步执行,它不会“撒谎”其本质。缺点是客户端代码(称为CreateLoader(string configValue) )现在必须使用as/is条件编码样式,才能知道它接收到了实际上是否为IAsyncDataDictLoaderIDataDictLoader

那么,在公开配置的实现是否支持异步的真实性质的同时,如何在松散耦合和扩展性需求之间取得平衡呢?

EN

回答 1

Stack Overflow用户

发布于 2013-05-30 14:36:37

我认为您应该做的是使您的接口异步。如果一个实现是同步的,它可以返回一个已经完成的Task。这样,您的消费代码就不需要了解该实现,并且可以将其视为异步的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16844468

复制
相关文章
部署一个Sinatra应用程序到Heroku
该文章介绍了如何部署一个Sinatra应用程序到Heroku。首先,需要设置一个Gemfile和一个config.ru文件,使用Git将应用程序部署到Heroku。然后,需要安装Heroku gem,生成SSH密钥并将其添加到Heroku。最后,通过运行`heroku keys:add`命令将SSH密钥添加到Heroku。
Seven塞文
2018/01/05
5.2K0
python启动应用程序和终止应用程序
每天上班,工作需要,电脑上需要每天开机启动一些软件,下班时候,需要关掉一些软件。一个一个打开和关闭貌似是很繁琐的,于是乎,这个脚本产生了。
py3study
2020/01/07
2.4K0
部署一个Sinatra应用程序到Heroku
该文章介绍了如何部署一个基于Sinatra的应用程序到Heroku。首先介绍了Heroku是什么,然后描述了如何利用Sinatra和Heroku创建应用程序,接着给出了部署应用程序的步骤,最后说明了如何通过SSH密钥在Heroku上部署应用程序。
Techeek
2018/01/05
2.7K0
adb shell 启动,停止 android 应用程序一、adb启动 应用程序二、adb停止 应用程序
包名和Activity类的类名一定要输入正确,可以用re-sign工具(在最后的弹出信息框会显示出包名和Activity类名)。
一个会写诗的程序员
2018/08/20
5.9K0
macOS上实现Qt应用程序做文件关联打开
用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现。Windows应用程序在安装的时候可以在注册表中写入相关的键值对。打开文件的时候,Windows Explorer会将文件完整的路径作为参数传递给关联的应用程序。这样就可以在启动程序后将这个文件作为目标进行处理。
24K纯开源
2019/07/02
2.1K0
如何在 Mac 上同时打开多个 MediaInfo 应用程序实例?
了解音视频分析工具的小伙伴,一定都知道 MediaInfo,它是一款非常实用的视频参数检测工具,除了可以对视频进行编码分析查询外,还可以对音频文件的编码及信息进行检测,最重要的是这款工具软件是免费的,在 mac OS 系统上此类工具是不常见的,另外,它也有 windows 版本。下面展示一下 MediaInfo 的使用效果:
liuzhen007
2021/10/20
1.5K0
在Heroku中部署一个Sinatra应用程序
在Heroku中部署一个Sinatra应用程序。首先需要在Heroku上注册一个账号,然后创建一个应用程序。接着通过在Gemfile中添加必要的Ruby gems来配置你的应用程序。最后,使用Git将你的应用程序推送到Heroku,并在Heroku上启动该应用程序。
Techeek
2018/01/05
2.7K0
在Heroku中部署一个Sinatra应用程序
应用程序InetlliJ IDEA不能打开
一大早回公司想打开 IDEA,准备魔改一下 Spark,突然发现前两天更新的 IDEA 打不开了(那天更新完后没有尝试打开),WTF。打不开的表现是双击图标毫无反应,我第一反应是,我系统有多个 IDEA,而且还有 N 个版本还有各种社区版交错,当然还有之前一直用的破解版,会不会是版本的问题呢?既然公司现在可以提供企业版,那就没理由继续盗版了,而且那是好几年前了。虽然电脑换过很多次了,但是每次都是 Time Machine,所以配置什么的是一直同步着的,而且 IDEA 是 Java 写的,找 BUG 找问题的思路跟开发 Java 应用的时候也应该是类似的。
runzhliu
2020/08/06
1.8K0
使用Python,怎么mac 上打开一个应用程序?
今天再来分享一个使用os库的小程序,就是如何在mac上打开一个应用程序。我们就以打开Safari浏览器为例。程序非常简单,就是执行一个shell命令。具体程序如下:
TalkPython
2020/12/29
2.7K0
Android源码分析--应用程序启动
1.AMS通过调用startProcessLocked方法向Zygote进程发送请求。
xuexiangjys
2022/04/18
6340
Android源码分析--应用程序启动
应用程序进程启动过程
1.AMS在启动应用程序时会检查者应用程序需要的应用进程是否存在,不存在就会请求Zygote进程启动需要的应用程序进程
用户3112896
2019/09/26
7440
应用程序进程启动过程
应用程序启动速度的优化
Mozillaproject师通过优化Static Initializer(静态初始化,或全局建构函数, Global Constructor)和Binary布局来提升FireFox启动速度的文章。很有參考价值。
全栈程序员站长
2022/07/06
5560
Electron 使用 Webpack2 打包应用程序
前两天看了一下使用 Electron 开发应用程序,今天说说所怎样集成 Electron 和 Webpack2 来打包应用程序。 安装依赖库 这里准备做个小的演示程序,首先安装一些这个演示程序需要看的第三方库 $ npm install --save-dev electron $ npm install --save-dev electron-packager $ npm install --save-dev webpack $ npm install --save-dev webpack-dev-se
kongxx
2018/05/14
1.1K0
WPF 如何在应用程序调试启动
如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。
林德熙
2019/03/13
9040
WPF 如何在应用程序调试启动
WPF 如何在应用程序调试启动
如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。
林德熙
2018/09/19
1.1K0
WPF 如何在应用程序调试启动
Quicksilver - 快速启动你的应用程序
偶然间看别人的视频无意中发现这个小软件,感觉很实用。 它是一个launcher,使用它可以通过键盘快速的启动你的应用程序,而不必用鼠标在一堆的应用程序中选择。
EltonZheng
2021/01/26
5320
WPF 如何在应用程序调试启动
如果在一些无法使用源代码编译的电脑,调试一个exe无法启动,那么需要使用本文的技术。
林德熙
2022/08/04
9020
Spring Boot 应用程序启动流程分析
@SpringBootApplication SpringApplication 以及 run() 方法
凯哥Java
2019/06/28
7100
Spring Boot 应用程序启动流程分析
Spring Boot 应用程序启动流程分析
@SpringBootApplication SpringApplication 以及 run() 方法
动力节点Java培训
2019/01/21
8700
在 .NET 应用程序中运行 JavaScript
前几天我在做一个副业,意识到我需要使用一些 JavaScript 功能。一想到要再次处理 Node.js 和 npm,我就完全放弃了,所以我决定研究一下在 .NET 应用程序中运行 JavaScript 的可能性。很疯狂吧?实际上,这出乎意料的简单。
独立观察员
2022/12/06
2.7K0
在 .NET 应用程序中运行 JavaScript

相似问题

Heroku上的Clojure应用程序未启动;Aleph + RedisToGo超时

10

Heroku应用程序启动超时

32

Heroku上的Scala应用程序-启动超时

20

heroku上的react应用程序未启动

24

Play 2.5.4应用程序在Heroku上未启动

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档