我是一个使用.Net 4.0开发项目的程序员,并试图找出将松散耦合和可扩展的设计与相同的逻辑操作有时异步执行,有时仅同步执行的最佳方法(每个支持异步的实现都支持同步,而不是反过来)。在这个项目中,每个这样的逻辑操作都由一个接口来表示(松散耦合和扩展性要求很高)。让我们把我的问题集中在一个特定的接口上:IDataDictLoader
。这个接口负责加载一个名为DataDict
的对象。该接口有两种可能的实现:一种称为LocalDataDictLoader
,它使用本地dll并同步执行操作(返回DataDict
),另一种称为WebServiceDataDictLoader
,它使用web服务并执行LocalDataDictLoader
(返回Task<DataDict>
) 或同步操作。配置文件中的值确定要创建的实现--如果值为"Local“,则创建LocalDataDictLoader
,如果值为"WebService”,则创建WebServiceDataDictLoader
。在函数IDataDictLoader CreateLoader(string configValue)
中,创建部分使用由约定指导的反射。调用该函数并使用该接口的代码不知道前面的实现是什么,即使它想知道它也无法访问配置值。问题是如何设计接口?到目前为止,我想到了许多选择:
LocalDataDictLoader
中为同步版本设置异步包装。正如Stephen 这里所建议的那样,这不是一个推荐的解决方案。Task<DataDict>
,并让同步实现同步地完成加载,然后使用TaskCompletionSource<DataDict>
重新调整已完成的任务。由于同样的原因,这与备选案文1是错误的。IDataDictLoader
用于同步,IAsyncDataDictLoader : IDataDictLoader
用于异步和同步。该解决方案为客户端代码提供了知识,如果操作可以异步执行或不同步执行,它不会“撒谎”其本质。缺点是客户端代码(称为CreateLoader(string configValue)
)现在必须使用as/is条件编码样式,才能知道它接收到了实际上是否为IAsyncDataDictLoader
的IDataDictLoader
。那么,在公开配置的实现是否支持异步的真实性质的同时,如何在松散耦合和扩展性需求之间取得平衡呢?
发布于 2013-05-30 14:36:37
我认为您应该做的是使您的接口异步。如果一个实现是同步的,它可以返回一个已经完成的Task
。这样,您的消费代码就不需要了解该实现,并且可以将其视为异步的。
https://stackoverflow.com/questions/16844468
复制