Skip to content
Umut Ozel edited this page Sep 13, 2017 · 8 revisions

İşte kopyalama veya kopyalama tanımı edinme için kullanabileceğimiz yöntemler.

*Not 1: Tüm kayıt işlemleri tek-taraflı yapılır. Eğer DTO'dan Entity oluşturmak istiyorsanız ayrıca bu ikiliyi de kayıt etmeniz gerekir.

*Not 2: Tüm RegisterMap metodları aynı tipler için varolan kaydı ezerler.


  • Tip parametresiz metod ile kayıt yapabiliriz. Bu yöntemde oluşturulan kopyalama koduna müdahale edemeyiz.
public IMapDefinition RegisterMap(Type inType, Type outType)

Customer ve CustomerDTO için kopyalama tanımını aşağıdaki gibi oluşturabiliriz:

config.RegisterMap(typeof(Customer), typeof(CustomerDTO), 
    builder => builder.SkipMember("Address").MapMember("Phone", "WorkPhone")
);

  • Tip parametreli metodu çağırabiliriz. Böylece oluşturulacak kodu ifadeler ile özelleştirebiliriz.
public IMapDefinition<TIn, TOut> RegisterMap<TIn, TOut>(Action<MapBuilder<TIn, TOut>> buildAction = null)

config.RegisterMap<Customer, CustomerDTO>(
    builder => builder
        .SkipMember(c => c.Address)
        .MapMember(c => c.Phone, (c, mc) => c.WorkPhone)
);

İşte "Address" alanını kopyalamadan çıkardık ve "Phone" alanı için isim sorununu giderdik.


  • Kopyalama işini yapacak kodu biz verebiliriz.
public IMapDefinition<TIn, TOut> RegisterMap<TIn, TOut>(Expression<Func<TIn, MapContext, TOut>> expression)

config.RegisterMap<Customer, CustomerDTO>((c, mc) => new CustomerDTO {
    Id = c.Id,
    Address = c.Address,
    Phone = c.WorkPhone,
    Detail = mc.Map<CustomerDetail, CustomerDetailDTO>(c.Detail)
});

mc, MapContext örneğidir. İlişki alanlarını kopyalayan manuel kodu da verebiliriz (örneğin "Detail" için) ya da MapContext kullanabiliriz. MapContext kullandığımızda, BatMap ilişkili alanları çalışma zamanı sorgu yansıtma yaparken koddan çıkarabilir.

i.e. Diyelim ki bir IQueryable<Customer> sorgumuz var ve bunu IQueryable<CustomerDTO> sorgusuna çevirmek istiyoruz. BatMap öncelikle sorgumuzdaki dahil edilmiş ilişkili alanları kontrol eder (varsayılan olarak) ve dahil olanlar için sorguyu genişletir. Bu özelliğin çalışabilmesi için MapContext metodlarını kullanmalıyız:

var query1 = context.Customers.Include(c => c.Detail);
var dtoQuery1 = query.ProjectTo<CustomerDTO>(); // Detail will be included

var query2 = context.Customers;
var dtoQuery2 = query.ProjectTo<CustomerDTO>(); // Detail won't be included

  • Bir MapDefinition isteyebiliriz. Eğer bu tipler için kayıt henüz oluşturulmamışsa, MapConfiguration'ın dynamicMapping ayarı kontrol eder ve buna göre davranır.
public IMapDefinition<TIn, TOut> GetMapDefinition<TIn, TOut>()

  • BatMap'i yeni bir MapDefinition oluşturmaya zorlayabiliriz. Bu metodun yan etkileri yoktur (GetMapDefinition metodunun otomatik kayıt oluşturması gibi).
public IMapDefinition<TIn, TOut> GenerateMapDefinition<TIn, TOut>(Action<MapBuilder<TIn, TOut>> buildAction = null)

Statik API

Mapper statik sınıfı yukarıdaki metodlardan GetMapDefinition ve GenerateMapDefinition haricinde hepsine sahiptir.

Kopyalama