ken*_*dev 5 .net architecture dynamic c#-4.0 massive
我正在寻求与这篇文章进行讨论.
我正在考虑将C#4.0动态功能集成到遗留系统中.我的明确例子是在数据层中使用Rob Connery的Massive.但是我的问题将适用于动态对象必须与现有的强类型业务对象交互的任何地方,以便在属性之间存在映射.
我可以使用以下两个(简化)方法自动转换静态(具体)对象和expando对象的转换:
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;
}
Run Code Online (Sandbox Code Playgroud)
但现在我有很多问题.
我在遗留系统中跨越动态和非动态的尝试是否代表了我的误解?意思是,我是否在反对动态的意图?我是否为自己做好准备?
我对动态的使用是否仅限于完全包含它的组件,而动态对象和静态对象之间没有映射?意思是,尝试混合两个语言域是不好的做法吗?我创建了糟糕的架构吗?反模式?
对于像Massive这样的组件,如果我们说在ExpandoObject和强类型对象之间进行映射是不好的做法,那么我就无法将其插入到我的遗留系统中,因为它必须将业务对象映射到遗留代码中我不能或不应该将大型遗留代码库的对象重构为动态对象.也许动态无法真实地添加到遗留的.Net代码库中.也许它必须从一开始就加入,或者根本不加入.
因此,您只想将静态类型对象映射到动态对象,以便它们可以在 Massive 中使用。我认为这很好,就像将业务对象映射到 LINQ to SQL 对象,这样您就可以使用该 ORM。但缺点是您最终将映射数据库内外的所有内容。这可能会成为一种痛苦。LINQ to SQL 对我来说很痛苦。
想想更改代码会是什么样子,然后您就可以衡量这种方法的有效性。对我来说,当我需要向业务对象添加属性时,我必须:
这是一种痛苦。如果您的地图助手工作正常,那么您使用 Massive 的方法意味着您必须执行以下操作:
那还不错。另外,如何处理对象图?如果您有一个人员表和一个具有 1-M 关系的地址表,这意味着一个人可以有多个地址。如何查询并获取人员列表及其地址?您的地图会是什么样子?
另一种方法是查看 NHibernate 或实体框架是否适合您的情况。它们被设计用于处理静态类型的对象。Massive 看起来像是专为快速轻松的数据访问而设计的。另一个为静态类型对象构建的快速且简单的库是Dapper。它很容易使用。在 Nuget 上查看一下。事实上,根据我对你的情况的了解,我会强烈考虑Dapper。
| 归档时间: |
|
| 查看次数: |
2780 次 |
| 最近记录: |