我正在审查/重构一些代码,但遇到了我不喜欢的相互依赖关系,但我不确定在 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);
然后在ConcreteDataProvider
执行中onConnect
我将数组转换为MyObject[]
. (从Unable to cast object of type 'System.Object[]' to 'MyObject[]' 看来,这意味着我需要使用Array.ConvertAll
)
这是一个糟糕的设计,会回来困扰我吗?
顺便说一句,调用ToArray()
触发数据下载,我不想onConnect()
在它完成之前调用。在幕后它也触发了实际的连接;在执行第一个查询之前,我不知道连接是否有效并且是否正常工作。这就是为什么我不想传递IEnumerable
给OnConnect()
,并让它调用 to ToArray()
。