2011-04-07 5 views
4

AutoMapper을 사용하여 내 응용 프로그램의 여러 레이어간에 개체를 매핑합니다.AutoMapper :지도를 추상 클래스에 매핑 -이게 가능합니까?

public interface MyRepo 
{ 
    IEnumerable<IRootObject> GetItems(param); 
} 

IRootObject는 다음과 같습니다 :

public interface IRootObject 
{ 
    int Id { get; set; } 
    DateTime? Date { get; set; } 
} 

public interface IFirstSubObject : IRootObject 
{ 
    string MyFirstProp { get; set; } 
} 

public interface ISecondSubObject : IRootObject 
{ 
    string MySecondProp { get; set; } 
} 

는 그래서 GetItems() 호출이 실제로에만 IxxxSubObjectItems의 배열을 반환하는 하나 개의 측면에서 나는이처럼 보이는 인터페이스를 가지고있다. 만드는, 내가 그렇게

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot> 
    .Include<IFirstSubObject, MyCustomFirstSub> 
    .Include<ISecondSubObject, MyCustomSecondSub>(); 

AutoMapper.Mapper.CreateMap<IFirstSubObject, MyCustomFirstSub>(); 
AutoMapper.Mapper.CreateMap<ISecondSubObject, MyCustomSecondSub>(); 

처럼 매퍼을 설정 한 지금

public abstract class MyCustomRoot 
{ 
    protected MyCustomRoot(){} 
    public int Id { get; set; } 
    public DateTime? Date { get; set; } 
} 

public class MyCustomFirstSub : MyCustomRoot 
{ 
    public MyCustomFirstSub() : base() {} 
    public string MyFirstProp { get; set; } 
} 

public class MyCustomSecondSub : MyCustomRoot 
{ 
    public MyCustomSecondSub() : base() {} 
    public string MySecondProp { get; set; } 
} 

하지만 "추상 클래스를 생성 할 수 없습니다"(점점 MapperExceptions을 유지 : 다른 측면 구조에 은 다음과 같습니다 감각). 또한 AssertConfigurationIsValid이라고 부르며이 코드를 전달합니다.
MyCustomRoot 클래스를 추상화하지 않으면 매핑이 작동하지만 MyCustomRoot 개체 목록이 표시되는 반면 실제로 나중에이 유형을 사용하는 팩터가 있기 때문에 실제로 MyCustomxxxSub의 목록을 갖고 싶습니다. 올바른 UI를 생성하려면 ...

나는이 사람이 올바른 방향으로 나를 가리킬 수 있기를 바랍니다!
감사합니다.

답변

7

좋아 실제로 이것을 할 방법을 찾았습니다! 그래서 위에서 제공하는 인터페이스와 클래스로,이
과 같은 작업을 수행 할 수 있습니다 (기억하십시오 MyCustomRoot 클래스는 추상적이다)

AutoMapper.Mapper.CreateMap<IRootObject, MyCustomRoot> 
    .Include<IFirstSubObject, MyCustomFirstSub> 
    .Include<ISecondSubObject, MyCustomSecondSub>(); 

다음 개체를 매핑 할 followig지도 호출을 사용 :

public List<MyCustomRoot> PerformMapping(List<IRootObject> rootObjects) 
{ 
    var returnList = new List<CustomRoot>(); 
    foreach(var rootObject in rootObjects) 
    { 
     var abstractObject = (MyCustomRoot)Mapper.Map(rootObject, rootObject.GetType(), typeof(MyCustomRoot)); 
     returnList.Add(abstractObject); 
    } 
    return returnList; 
} 

이제 모든 구체적인 구현 인 MyCustomRoot 개체의 배열을 얻습니다.

이것은 내가 찾고있는 것입니다.

+1

질문에서 코드와 다른 점에 대해 자세히 설명해 주실 수 있습니까? 나는이 시도했지만 여전히 "추상 클래스를 만들 수 없습니다"예외가 ... – guillaume31

+0

좋아, 그것은 버전 4.x 작동하지 않지만 3.2 않습니다 보인다. 기묘한. – guillaume31

0

그렇다면 그 팩토리에 매핑하여 삽입하고 적절한 인스턴스를 만들도록해야합니다. 이는 인스턴스화해야 할 팩토리를 분명히 알고있는 팩토리이기 때문입니다.

+0

글쎄요. 팩토리는 또 다른 레이어에 있으며 추상적 인'MyCustomRoot' 객체를 입력으로받습니다. 어쨌든 도움을 주셔서 감사합니다! – RoelF

관련 문제