就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。
9年前关闭。
我正在寻求与这篇文章的一些讨论。
我正在考虑将 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 代码库中。也许它必须从一开始就合并,或者根本不合并。
最佳答案
所以你只想将静态类型的对象映射到动态对象,以便它们可以在 Massive 中使用。我认为这很好,就像将业务对象映射到 LINQ to SQL 对象一样,这样您就可以使用该 ORM。但不利的是,您最终将映射进出数据库的所有内容。这可能会成为一种痛苦。使用 LINQ to SQL 对我来说很痛苦。
想想更改代码会是什么样子,然后您就可以衡量这种方法的有效性。对我来说,当我需要向业务对象添加属性时,我必须:
表
这是一种痛苦。您使用 Massive 的方法,如果您的映射助手工作正常,则意味着您必须执行以下操作:
表
这还不错。另外,如何处理对象图?如果您有一个 Person 表和一个具有 1-M 关系的 Address 表,这意味着一个人可以有多个地址。您如何查询并获取带有地址的人员列表?你的映射会是什么样子?
另一种方法是查看 NHibernate 或 Entity Framework 是否适用于您的情况。它们旨在处理静态类型的对象。 Massive 看起来像是专为快速轻松地访问数据而设计的。另一个为静态类型对象构建的快速简便的库是 Dapper .它很容易使用。在 Nuget 上查看。实际上,根据我对您的情况的了解,我强烈考虑 Dapper。
关于.net - ExpandoObject 到静态对象,然后再返回。跨越两个域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717281/