![](/img/trans.png)
[英]Expose C# classes in .net 4 class library to Silverlight App
[英]C# interface design, expose library classes?
我想定义一个包含键/值对“元数据”数组的接口“IFile”。 在获取或设置这些键/值对时,IFile 实现者应该能够采取行动。 go 关于这个问题的最佳方法是什么? 我看到了三种方法:
方法1)获取/设置字典object:
public interface IFile
{
...
Dictionary<String, String> GetMetadata();
void SetMetadata(Dictionary<String, String> metadata);
}
方法2)直接使用字典class:
public interface IFile
{
...
Dictionary Metadata();
}
并且在 IFile 的实现中,可以提供作用于 get/set 的 Dictionary 的继承版本。
方法3)完全避免使用Dictionary并提供自定义界面,例如:
public interface IMetadata
{
String GetValue(String key);
void SetValue(String key, String value);
Boolean Contains(String key);
void Delete(String key);
...
}
public interface IFile
{
...
IMetadata Metadata();
}
我倾向于方法 3,因为它让实现者决定如何实际实现元数据数据结构。 其他解决方案强制使用字典。 然而方法 3 似乎涉及很多额外的包装代码。
我感觉在这个问题的背后,在设计 class 层次结构时存在一个更深层次的困境,即是直接公开库类还是公开一些隐藏内部使用的库 class 的包装函数。 我在制作 OOP 设计方面几乎没有实际经验,因此非常欢迎就这方面的“正确方式”提出建议!
谢谢,
拉斯
如果元数据的类型在编译时已知,那么我个人可能会为此使用 go :
public interface IFile
{
...
IDictionary<string, string> Metadata { get; }
}
注意- IDictionary 而不是 Dictionary - 这让实现 class 来决定使用哪种类型的字典实现。
(我使用字符串作为字典类型的示例,也是因为这是您用于 IMetadata 的类型 - 如有必要,请更改以适应您的需要)
ps - 如果元数据的键范围是固定的并且相对较小,则将键设为枚举 - 这比字符串比较更有效。
我喜欢选项 3(在接口中定义方法),因为:
方法四:
public class JFile
{
...
protected Dictionary Metadata() { ... }
...
// --> all this use "Dictionary" internally
// --> but, do somthing to other "IFile" fields
public String GetValue(String key) { ... }
public void SetValue(String key, String value) { ... }
public Boolean Contains(String key) { ... }
public void Delete(String key) { ... }
}
对不起,如果看起来我的答案很复杂。
我打算建议方法2,但是...
...既然你提到当主要 object / 接口“IFile”,当元数据的单个值发生变化时必须执行一些操作,并且元数据项没有“代表”,“事件”,等等仍然对元数据进行分组是个好主意。
如果你的界面只存储数据,在添加或删除项目时不执行任何操作,方法2会更实用。
在我看来,通过直接跳入界面,您自己很复杂。 我建议:
有一种“更好的方式”,但“正确、完美的方式”在软件开发中并不存在,因为它太复杂了,没有单一的方式来做事。 即使您选择另一种方法,如果它有效,那么它也有效。
祝你好运;-)
如果您担心在键值对字典中强制 inheritance 关闭字典,为什么不使用 IDictionary?
那么你的第一种方法很有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.