2012-04-14 1 views
2

Есть ли какие-либо рамки, которые можно сделать следующее:Framework для объединения хозяйствующих субъектов

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 получает экземпляр объекта. Некоторые свойства экземпляра являются нулевыми. (исходный экземпляр)

  2. Приложение извлекает из базы данных объект с тем же идентификатором, что и в источнике. (целевой экземпляр)

  3. Объединение двух объектов и сохранение объединений в базу данных.

Основная проблема заключается в том, что в моем проекте около 600 объектов, поэтому я не хочу писать логику объединения для каждого объекта вручную. В принципе, я ищу что-то вроде гибкого AutoMapper или ValueInjecter, которые удовлетворяют следующим требованиям:

  • Предоставлять возможность указать тип слияния условия. Например: if source.IntProp == int.MinInt -> не сливать свойство

  • Предоставьте возможность указать особые условия недвижимости. Как и в AutoMapper:

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

ответ

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

} 
0

Чтобы обновить текущий ответ, ConventionInjection устарел. Теперь вы можете использовать LoopInjection при создании пользовательских инъекций.

Пример обновленного класса Merge Injection:

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

} 
+0

Я теперь с помощью ExpressMapper вместо ValueInjector теперь. :-) –