【发布时间】:2012-06-28 04:30:53
【问题描述】:
我有一个很大的 A 类,有很多成员,我有一个很大的 B 类 可以在拥有 A 对象时构建。一个 A 对象可以在有时被构建 B 对象。我需要他们两个,因为 A 是一种 ViewModel,它有验证 B是图形描述,可以很容易地绘制出来。
如何进行这种转换?
这是一个例子,说明我想要做什么:
class A
{
string s;
string t;
string u;
string v;
enum a;
enum b;
enum c;
enum d;
enum e;
Dictionary<enum, string> dict;
}
class B
{
string someString; // is essentially A.a + A.b + A.c + A.s with some rules.
int someValue; // is essentially dict.TryGetValue(enum.Entry);
string anotherString;
// ... and lots of others
}
当然做一些映射很简单,建立一个B对象, 并且通过反转来编写普通的 B => A 映射并不难 构建 A => B
的规则所以问题是:
- 是否有任何众所周知的模式可以实现这一目标?
- 是否有默认的 C# 方式来执行此类操作?
这样简单地写下来似乎不合适, 它最终变成了数百行代码。
我想到了一些用于零件的转换器类, 比如 SomeStringConverter, SomeValueConverter, ...
- 如何将 A 的所需成员与 进行映射的规则。
- 我怎样才能写出这些规则来获得最简单的可能 A => B 和 B => A 的方式。
编辑: 这里的模式是指“最佳实践”,而不是“GoF 设计模式”
B 类中的SomeString 是某种“选择器”,它选择绘图 选项,它总是 25 个字符长并且 A 类中的枚举选择 那些字符,但在大多数情况下不是一对一的。
比如说:A.a = "Filled", A.b = "SingleCoordinate", A.c = "DrawHints" 将导致类似 SomeString =
"Y**D***RR****---***---***"
即组合对于获得这样的字符串很重要,但是从组合 您可以派生必须在 A 对象中设置的枚举。
编辑2:
我对两种方式都使用我的映射规则的方式特别感兴趣,即
A.a = "Filled" 结合 A.b = "SingleCoordinate" 结合 A.c = "DrawHints" 将导致(部分字符串)"Y**D***RR",并且该部分字符串也意味着
A.a 必须设置为“已填充”等等。
【问题讨论】:
-
只需让其中一个类继承另一个即可。
-
认为这不是最好的方法,因为一个具有输入验证,另一个尽管在构图上完全不同,但易于绘图,但内容相似,但已映射。但很明显,我已经考虑过拥有一些 PONO 类来保存数据和两个转换器,从而产生 A 和 B 以及 A => PONO 和 B => PONO 的转换器。也许这就是要走的路。
-
这是 POCO,毕竟这是 .net :)
-
当然,你是对的!想到了一些 .NET 对象...
-
您能举例说明 B 中的“someString”是什么样的吗?
标签: c# design-patterns architecture mapping converter