扩展对象为静态对象,然后再返回.跨越两个域



我正在寻找一些关于这篇文章的讨论。

我正在考虑将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到SQL对象,这样你就可以使用ORM。但缺点是,您最终将映射数据库内外的所有内容。这可能会成为一种痛苦。使用LINQ to SQL对我来说是件痛苦的事。

想想修改代码会是什么样子,你就可以衡量这种方法的有效性了。对于我来说,当我需要向业务对象添加属性时,我必须:

  1. 将属性添加到对象
  2. 写DB迁移来修改表
  3. 生成LINQ to SQL文件
  4. 映射新属性

这是一个痛苦。使用Massive的方法,如果您的映射助手工作正常,则意味着您必须这样做:

  1. 将属性添加到对象
  2. 写DB迁移来修改表

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

另一种方法是看看NHibernate或实体框架是否能在你的情况下工作。它们被设计用于处理静态类型的对象。Massive看起来是为快速方便地访问数据而设计的。另一个为静态类型对象构建的快速而简单的库是Dapper。它很容易使用。去Nuget看看吧。事实上,根据我对你的情况的了解,我强烈推荐戴珀。

最新更新