2

次のことができるフレームワークはありますか?

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. アプリはエンティティ インスタンスを取得します。インスタンスの一部のプロパティが null です。(ソースインスタンス)

  2. アプリは、ソースと同じ ID を持つエンティティをデータベースからフェッチします。(対象インスタンス)

  3. 2 つのエンティティをマージし、データベースにマージして保存します。

主な問題は、プロジェクトに 600 近くのエンティティがあるため、各エンティティのマージ ロジックを手動で記述したくないことです。基本的に、次の要件を満たす AutoMapper や ValueInjecter のような柔軟なものを探しています。

  • タイプのマージ条件を指定する可能性を提供します。例: source.IntProp == int.MinInt -> プロパティをマージしない場合

  • プロパティ固有の条件を指定する可能性を提供します。AutoMapper のように:

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

4

2 に答える 2

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; }
    }

}
于 2012-04-15T10:15:17.613 に答える
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);
    }

}
于 2016-10-26T14:47:51.683 に答える