我正在审查/重构一些代码,我遇到了一个我不喜欢的相互依赖,但我不确定在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
的{{1}}实现中,我将数组转换为onConnect
。
(根据Unable to cast object of type 'System.Object[]' to 'MyObject[]', what gives?的外观,这意味着我需要使用MyObject[]
)
这是一个糟糕的设计会再次困扰我吗?
顺便说一句,对Array.ConvertAll
的调用会触发数据下载,我不希望ToArray()
调用直到完成。在幕后,它也触发了实际的连接;我不知道连接是否有效并且在第一次查询执行之前一直有效。这就是为什么我不想将onConnect()
传递给IEnumerable
,并让它调用OnConnect()
。
答案 0 :(得分:4)
如何使用泛型?
public interface IConnection<T>
{
void Connect(string user, string pw, Action<T[]> onConnect);
void Disconnect();
}