5

我正在寻求与这篇文章的一些讨论。

我正在考虑将 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 代码库中。也许它必须从一开始就被合并,或者根本不合并。

4

1 回答 1

2

所以你只想将静态类型的对象映射到动态对象,这样它们就可以在 Massive 中使用。我认为这很好,就像将业务对象映射到 LINQ to SQL 对象一样,您可以使用该 ORM。但缺点是您最终将映射所有进出数据库的内容。这可能会成为一种痛苦。使用 LINQ to SQL 对我来说很痛苦。

想一想更改代码会是什么样子,然后衡量这种方法的有效性。对我来说,当我需要向业务对象添加属性时,我必须:

  1. 将属性添加到对象
  2. 编写数据库迁移以更改表
  3. 重新生成 LINQ to SQL 文件
  4. 映射新属性

这是一种痛苦。如果您的映射助手工作正常,您使用 Massive 的方法意味着您必须执行以下操作:

  1. 将属性添加到对象
  2. 编写数据库迁移以更改表

这还不错。另外,如何处理对象图?如果您有一个 Person 表和一个 Address 表,其关系为 1-M,这意味着一个人可以有多个地址。您如何查询并获取带有地址的人员列表?你的映射会是什么样子?

另一种方法是查看 NHibernate 或实体框架是否适用于您的情况。它们被设计用于处理静态类型的对象。Massive 看起来像是专为快速轻松地访问数据而设计的。另一个为静态类型对象构建的快速简便的库是Dapper。它很容易使用。在 Nuget 上查看。实际上,根据我对您的情况的了解,我强烈考虑使用 Dapper。

于 2011-10-11T17:23:11.543 回答