【发布时间】:2012-11-26 09:45:45
【问题描述】:
我正在审查/重构一些代码,但遇到了我不喜欢的相互依赖关系,但我不确定在 C# 中解决此问题的最佳方法是什么。我的问题的本质是在一个文件中我有:
class MyObject
{
public string Name {get;set;}
public int? Age {get;set;}
}
public interface IConnection
{
void Connect(string user,string pw,Action<MyObject[]> onConnect);
void Disconnect();
}
然后在另一个文件中:
public class ConcreteDataProvider : IConnection
{
public void Connect(string user,string pw,Action<MyObject[]> onConnect)
{
//...
IEnumerable<MyObject> collection = ...
onConnect( collection.ToArray() );
}
}
我对这个设计的问题是MyObject 是特定于这个具体的数据提供者。我不想在IConnection 中提到它。
我的想法是将IConnection.Connect() 重构为:
void Connect(string user,string pw,Action<Object[]> onConnect);
然后在onConnect 的ConcreteDataProvider 实现中,我会将数组转换为MyObject[]。
(从Unable to cast object of type 'System.Object[]' to 'MyObject[]', what gives? 看来,这意味着我需要使用Array.ConvertAll)
这是一个糟糕的设计,会再次困扰我吗?
顺便说一句,对ToArray() 的调用会触发数据下载,我不希望在完成之前调用onConnect()。在幕后它也触发了实际的连接;在执行第一个查询之前,我不知道连接是否有效并且是否正常工作。这就是为什么我不想将IEnumerable 传递给OnConnect(),并让它调用ToArray()。
【问题讨论】:
-
IConnection和IDataProvider是不同的接口吗? -
@Rawling 抱歉,不,这是一个错字。我刚刚解决了这个问题。
标签: c# refactoring