2016-05-02 8 views
0

Ich verwende Entity-Framework für meine DAL und möchte Entitätsobjekte in Business-Objekte und umgekehrt konvertieren. Dies geschieht in meinem BLL-Projekt. Ich hoffe, Autoadapter in meinem BLL-Projekt zu installieren ... sagen wir Customer.cs automatisch von EF generiert und konvertiert es zu CustomerWithDifferentDetail.cs (mein Geschäft Obj)Automapper Konfiguration Setup

Ich habe versucht, eine AutoMapperBLLConfig.cs unter BLL zu erstellen Projekt mit dem folgenden Code:

public static void Configure() 
    { 
     Mapper.Initialize(cfg => 
     { 
      cfg.AddProfile(new CustomerProfile()); 
     }); 
    } 


public class CustomerProfile : Profile 
{ 
    protected override void Configure() 
    { 
     var config = new MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<Customer, CustomerWithDifferentDetail>(); 
      cfg.CreateMap<CustomerWithDifferentDetail, Customer>(); 
     }); 
    } 
} 

Dann habe ich CustermerService.cs unter BLL Projekt mit dem folgenden Code zu testen, ob es funktioniert:

public void CustomerToCustomerWithDifferentDetail() 
{ 
    AutoMapperBLLConfiguration.Configure(); 
    Customer source = new Customer 
     { 
      Account = 1234, 
      Purchase_Quantity = 100, 
      Date = "05/05/2016", 
      Total = 500 
     }; 

    Models.CustomerWithDifferentDetail testCustomerDTO = Mapper.Map<Customer, Models.CustomerWithDifferentDetail>(source) 
} 

ich diesen Fehler erhalten: Fehlende Kartentyp Konfiguration oder nicht unterstützte Zuordnung

Ich bin mir nicht sicher, was ich falsch gemacht habe. Ich habe kein start_up oder global.aspx. Dies ist eine Klassenbibliothek. Ich bin mir nicht sicher, was ich vermisse oder falsch gemacht habe.

Ich habe ein separates Projekt ruft Modelle, die alle Geschäftsobjekte einschließlich CustomerWithDifferentDetail.cs enthalten. In diesem Fall hat CustomerWithDifferentDetail nur zwei Eigenschaften: Konto und Gesamt. Wenn es zugeordnet wird, sollte es Account = 1234 und Total = 500 geben - im Grunde die gleichen Daten wie Entitätsobjekt nur in anderer Form.

======================= UPDATE ====================== =========== AutoMapperBLLConfig.cs - gleich bleiben wie oben

CustomerProfile.cs bemerkt

public class CustomerProfile : Profile 
{ 
    protected override void Configure() 
    { 
     var config = new MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<Customer, CustomerWithDifferentDetail>().ReverseMap(); //cut it down to one line with ReverseMap 
     }); 
    } 
    CreateMap<Customer, CustomerWithDifferentDetail>().ReverseMap(); //missed this one line before; hence, the error 
} 

CustomerService.cs

static CustomerService() 
    { 
     AutoMapperBLLConfiguration.Configure(); //per @Erik Philips suggestion, move this call to a static constructor 
    } 

public void CustomerToCustomerWithDifferentDetail() 
{ 
    Customer source = new Customer 
     { 
      Account = 1234, 
      Purchase_Quantity = 100, 
      Date = "05/05/2016", 
      Total = 500 
     }; 

    Models.CustomerWithDifferentDetail testCustomerDTO = Mapper.Map<Customer, Models.CustomerWithDifferentDetail>(source); 
} 

Ergebnis: mein testCustomerDTO gibt genau das zurück, was ich erwartet habe.

+0

können Sie setzen .Reverse() nach dem Erstellen die Karte. Keine Notwendigkeit, die zweite "umgekehrte" Linie zu machen. –

+0

Danke. Ich bin mir dessen bewusst. Ich frage mich, ob @James und Erik sich darauf beziehen, mehr als einmal zu kartieren ... – NKD

+0

Seien Sie vorsichtig, wenn Sie .ForMember und .Reverse mit spezifischen Membern verknüpfen. –

Antwort

0

Da Sie die Instanzmethode AutoMapper verwenden:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Customer, CustomerWithDifferentDetail>(); 
    cfg.CreateMap<CustomerWithDifferentDetail, Customer>(); 
}); 

Dann müssen Sie Verwendung die Instanz für die Zuordnung:

Models.CustomerWithDifferentDetail testCustomerDTO = 
    config.Map<Customer, Models.CustomerWithDifferentDetail>(source) 

Ich habe persönlich nicht wirklich gedacht werden durch in meine Anwendungen (I need to move to the instance method instead of the static method). (Migrating from status API).

Aus der Manschette, basierend auf Ihren Code, würde ich wahrscheinlich so etwas wie:

public class PersonDataObject 
{ 
    public string Name { get; set; } 
} 

public class PersonBusinessObject 
{ 
    private readonly MapperConfiguration _mapper; 

    public string Name { get; set; } 

    PersonBusinessObject() 
    { 
    _mapper = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<PersonDataObject,PersonBusinessObject>(); 
    }); 
    } 

    public static PersonBusinessObject MapFrom(PersonDataObject data) 
    { 
    return _mapper.Map<PersonBusinessObject>(data); 
    } 
} 

Dann können Sie einfach:

PersonDataObject data = new PersonDataObject(); 

PersonBusinessObject business = PersonBusinessObject.MapFrom(data); 
+0

Vielen Dank für den Vorschlag. Ich habe eine Frage. Wie greife ich auf "config" zu config.Map (Quelle) von CustomerService.cs? Sagen Sie, dass ich in meiner CustomerService.cs-Klasse eine Instanz des Profils erstellen muss? Wie für den zweiten Vorschlag. Ich mag, wie es super sauber und gepflegt aussieht, um einfach eine PersonBusinessObject.MapFrom (Daten) zu tun, aber die Zuordnung würde in jedem meiner Geschäftsobjekte streuen. Ich habe eine Tonne Obj zu kartieren. Hast du einen Vorschlag, sie an einem Ort zu gruppieren, ähnlich wie das Profil? – NKD

+0

Erstellen von Karten mehr als einmal wird nicht vom Autor von AutoMapper empfohlen, es ist ein teurer Prozess. Vielmehr speichern Sie Ihre 'IMapper' Instanz (erstellt von' MapperConfiguration.CreateMapper() ') statisch oder Dependency Injection verwenden, wie hier angemerkt: http://stackoverflow.com/questions/36619635/when-migrating-to-automapper-4 -2-5-0-sollte-i-store-an-imapper-Instanz-or-die/36691581 # 36691581 – James

+0

Wie @James erwähnt, nur mein Code die Zuordnung einmal erstellt den statischen Konstruktor. Sie könnten dasselbe für Ihr CustomerService-Objekt tun, denke ich. –

Verwandte Themen