我正在寻求与这篇文章的一些讨论。
我正在考虑将 C# 4.0 动态特性整合到遗留系统中。我的明确示例是在数据层中使用 Rob Connery 的 Massive。但是我的问题适用于动态对象必须与现有的强类型业务对象交互的任何地方,以便在属性之间存在映射。
我可以使用以下两种(简化)方法自动转换静态(具体)对象和扩展对象:
public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject)
{
object instance = Activator.CreateInstance<T>();
var dict = dynObject as IDictionary<string, object>;
PropertyInfo[] targetProperties = instance.GetType().GetProperties();
foreach (PropertyInfo property in targetProperties)
{
object propVal;
if (dict.TryGetValue(property.Name, out propVal))
{
property.SetValue(instance, propVal, null);
}
}
return instance;
}
public static System.Dynamic.ExpandoObject ToExpando(object staticObject)
{
System.Dynamic.ExpandoObject expando = new ExpandoObject();
var dict = expando as IDictionary<string, object>;
PropertyInfo[] properties = staticObject.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
dict[property.Name] = property.GetValue(staticObject, null);
}
return expando;
}
但现在我有很多问题。
我尝试在遗留系统中跨越动态和非动态是否代表我的误解?意思是,我是否违背了动态的意图?我是否为问题做好了准备?
我是否应该将动态的使用限制在完全包含动态对象且在动态对象和静态对象之间没有映射的组件上?意思是,尝试混合两种语言域是不好的做法吗?我在创造糟糕的架构吗?反模式?
对于像 Massive 这样的组件,如果我们说在 ExpandoObject 和强类型对象之间进行映射是不好的做法,那么我无法将它插入到我的遗留系统中,因为它必须将业务对象呈现到遗留代码中不是我可以或不应该将大型遗留代码库的对象重构为动态对象的实用方法。也许动态无法实际添加到遗留的.Net 代码库中。也许它必须从一开始就被合并,或者根本不合并。