合并业务实体的框架

时间:2012-04-14 18:25:25

标签: .net automapper valueinjecter

是否有任何框架可以执行以下操作:

var source = new Entity()
{
    StringProp = null,
    IntProp = 100,

};

var target = new Entity()
{
    StringProp = "stringValue", // Property value should remain the same if source value is null 
    IntProp = 222
};

var mergedEntity = MergeFramework.Merge(source, target); // Here is what I am looking for

Assert.AreEqual(100, mergedEntity.IntField);
Assert.AreEqual("stringValue", mergedEntity.StringField);

以下是我需要它的工作流程:

  1. App获取实体实例。实例的某些属性为null。 (来源实例)

  2. 应用程序从数据库中获取与源中具有相同标识的实体。 (目标实例)

  3. 合并两个实体并将合并保存到数据库。

  4. 主要问题是我的项目中有近600个实体,所以我不想手动为每个实体编写合并逻辑。基本上,我正在寻找像AutoMapper或ValueInjecter这样的灵活的东西,它们满足以下要求:

    • 提供指定类型合并条件的可能性。例如:if source.IntProp == int.MinInt - >不要合并属性

    • 提供指定特定属性条件的可能性。就像在AutoMapper中一样:

      Mapper.CreateMap()。ForMember(dest => dest.EventDate,opt => opt.MapFrom(src => src.EventDate.Date));

2 个答案:

答案 0 :(得分:1)

你去:

using System;
using NUnit.Framework;
using Omu.ValueInjecter;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var source = new Entity()
            {
                StringProp = null,
                IntProp = 100,

            };

            var target = new Entity()
            {
                StringProp = "stringValue", // Property value should remain the same if source value is null 
                IntProp = 222
            };

            var mergedEntity = (Entity) target.InjectFrom<Merge>(source);

            Assert.AreEqual(100, mergedEntity.IntProp);
            Assert.AreEqual("stringValue", mergedEntity.StringProp);
            Console.WriteLine("ok");
        }
    }

    public class Merge : ConventionInjection
    {
        protected override bool Match(ConventionInfo c)
        {
            return c.SourceProp.Name == c.TargetProp.Name
                   && c.SourceProp.Value != null;
        }
    }

    public class Entity
    {
        public string StringProp { get; set; }

        public int IntProp { get; set; }
    }

}

答案 1 :(得分:0)

要更新当前答案,我们已弃用ConventionInjection。现在,您可以在创建自定义注入时使用LoopInjection

更新的Merge注入类的示例:

public class Merge : LoopInjection
{

    protected override bool MatchTypes(Type source, Type target)
    {
        return source.Name == target.Name;
    }

    protected override void SetValue(object source, object target, PropertyInfo sp, PropertyInfo tp)
    {
        if (sp.GetValue(source) == null) return;
        base.SetValue(source, target, sp, tp);
    }

}