[C#] AutoMapper vs ValueInjecter [닫기]

StackOverflow에서 AutoMapper를 찾을 때마다 ValueInjecter 에 대해 읽습니다 .

누군가 그들 사이의 장단점 (성능, 기능, API 사용, 확장 성, 테스트)을 말해 줄 수 있습니까?



답변

ValueInjecter 의 제작자로서 간단하고 유연한 것을 원했기 때문에 내가 그렇게했다고 말할 수 있습니다.

나는 정말로 많이 쓰는 것을 좋아하지 않으며 다음과 같이 많이 쓰는 것을 좋아하지 않습니다 monkey code.

Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.

ValueInjecter는 플러그인을 갖춘 mozilla와 같은 것입니다. ValueInjections 를 만들어서 사용하십시오.

납작하게, 납작하게하기위한 내장 주사가 있으며, 일부는 상속되도록되어 있습니다.

그리고 측면 유형의 방식으로 더 많이 작동하므로 모든 속성을 일대일로 지정할 필요가 없으며 대신 다음과 같은 작업을 수행하십시오.

이름이 “Id”로 끝나는 모든 int 속성을 소스에서 가져 와서 값을 변환하고 ID 접미사없이 동일한 이름을 가진 소스 객체의 속성으로 각각 설정하고 유형은 Entity에서 상속됩니다.

명백한 차이점 중 하나는 ValueInjecter가 평탄화 및 전개 해제 기능이있는 Windows 양식에서도 사용됩니다.

(객체에서 폼 컨트롤로 다시 매핑)

Automapper, Windows 형태로는 사용할 수없고 전개도 해제되지 않지만 컬렉션 매핑과 같은 좋은 기능이 있으므로 ValueInjecter로 필요한 경우 다음과 같은 작업을 수행합니다.

foos.Select(o => new Bar().InjectFrom(o));

ValueInjecter를 사용하여 익명동적 객체 에서 매핑 할 수도 있습니다.

차이점 :

  • automapper는 각 맵핑 가능성에 대한 구성을 작성합니다. CreateMap ()

  • valueinjecter는 모든 객체에서 객체로 주입합니다 (객체에서 valuetype으로 주입하는 경우도 있습니다)

  • automapper에는 flattening이 내장되어 있으며 단순한 유형 또는 동일한 유형의 경우에만 평탄화되지 않습니다.

  • valueinjecter 당신은 당신이 그것을 필요로하는 경우에만 target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
    당신이에서 원하는 경우 Foo.Bar.Name of type StringFooBarName of type Class1당신이 FlatLoopValueInjection을 상속하고이를 지정

  • automapper는 기본적으로 같은 이름의 속성을 매핑하고 나머지는 하나씩 지정해야하며 Prop1.Ignore (), Prop2.Ignore () 등과 같은 작업을 수행해야합니다.

  • valueinjecter에는 이름과 유형이 같은 속성을 수행하는 기본 주입 .InjectFrom ()이 있습니다. 다른 모든 것에는 개별 매핑 로직 / 규칙을 사용하여 사용자 정의 값 인젝션을 만듭니다 (예 : Type Foo의 모든 소품에서 Bar의 모든 소품에 이르기까지)


답변

다른 도구를 사용한 적이 없으므로 AutoMapper에 대해서만 이야기 할 수 있습니다. AutoMapper를 구축하기 위해 몇 가지 목표를 염두에 두었습니다.

  • 멍청한 DTO 객체로 평탄화 지원
  • 즉시 사용 가능한 명백한 시나리오 지원 (컬렉션, 열거 등)
  • 테스트에서 매핑을 쉽게 확인할 수 있습니다
  • 다른 위치 (사용자 지정 유형-> 유형 매핑, 개별 멤버 매핑 및 일부 미친 에지 사례)에서 값을 해결하기위한 에지 사례를 허용합니다.

이러한 작업을 수행하려는 경우 AutoMapper가 매우 효과적입니다. AutoMapper가 잘 수행하지 못하는 것은 다음과 같습니다.

  • 기존 객체 채우기
  • 펴지다

내가 이런 일을 할 필요가 없었던 이유. 대부분의 경우 엔터티에는 세터가 없으며 컬렉션을 노출하지 않는 등의 이유가 있습니다. AutoMapper를 사용하여 DTO로 평면화하고 UI 모델에서 명령 메시지 등에 매핑합니다. 그것이 우리에게 정말 잘 작동하는 곳입니다.


답변

나는 두 가지를 모두 시도했고 ValueInjecter는 너무 간단하기 때문에 선호합니다.

myObject.InjectFrom(otherObject);

이것이 대부분의 주입 요구에 대해 알아야 할 모든 것입니다. 이보다 더 단순하고 우아하지는 않습니다.


답변

이것은 내가 연구 한 질문이며, 유스 케이스의 경우 가치 인젝터가 손에 넣은 것 같습니다. 사용할 사전 설정이 필요하지 않습니다 (스마트하게 구현하면 매번 반영하기보다는 나중에 호출하기 위해 매핑을 캐시 할 수 있지만 성능을 떨어 뜨릴 수 있음). 매핑을 사용하기 전에 미리 정의 할 필요가 없습니다.

그러나 가장 중요한 것은 역 매핑을 허용합니다. 지미가 필요로하는 유스 케이스를 보지 못한다고 언급하면서 여기에 뭔가 빠져있을 수 있습니다. 그래서 패턴이 잘못되었을 수도 있지만 내 유스 케이스는 ORM에서 ViewModel 객체를 작성하는 것입니다. 그런 다음 웹 페이지에 이것을 표시합니다. 사용자가 완료하면 ViewModel을 httppost로 다시 가져 오는데 어떻게 원래 ORM 클래스로 다시 변환됩니까? automapper로 패턴을 알고 싶습니다. ValueInjector를 사용하면 사소한 것이며 심지어 평평해질 수도 있습니다. 예 : 새로운 엔티티 생성

엔티티 프레임 워크로 작성된 모델 (모델 우선) :

public partial class Family
{
    public int Id { get; set; }
    public string FamilyName { get; set; }

    public virtual Address Address { get; set; }
}

public partial class Address
{
    public int Id { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string TownCity { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public virtual Family Family { get; set; }
}

ViewModel (유효성 검사기로 장식 할 수 있음) :

public class FamilyViewModel
{
    public int Id { get; set; }
    public string FamilyName { get; set; }

    public int AddressId { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressTownCity { get; set; }
    public string AddressCounty { get; set; }
    public string AddressPostcode { get; set; }
}

ViewController :

    //
    // GET: /Family/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Family/Create

    [HttpPost]
    public ActionResult Create(FamilyViewModel familyViewModel)
    {
        try
        {
            Family family = new Family();
            family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
            db.Families.Add(family);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

내 생각 엔 그보다 훨씬 간단하지 않습니까?

(그래서 이것은 질문을 제기합니다.이 패턴에 문제가 있고 (다른 많은 사람들이하는 것처럼 보입니다) AutoMapper에 가치가없는 것으로 보입니까?)

그러나이 패턴이 규정 된대로 사용하려는 경우 내 투표는 국가 마일리지로 가치 인젝터입니다.


답변