26 Nisan 2015 Pazar

Fluent NHibernate Automapping(Otomatik Eşleme)


    Herkese merhabalar.

   Bugün sizlere Fluent NHibernate'in sağlamış olduğu kolaylıklardan bir tanesi olan otomatik eşlemeden bahsedeceğim.  Büyük uygulamalarda modellerinizin eşleştirmelerini yapmak size oldukça sıkıcı gelebilir. Bu durumdan sizi kurtarmak üzere otomatik eşleştirme yardımınıza koşacak. Automapping kavramı; isimlendirme grupları kullanılarak gerçekleştirilen ve objelerinizi otomatik bir şekilde sınıflandıran mekanizmadır [1]. Otomatik eşleştirmede isimlendirme gruplarına(conventions) neden ihtiyaç duyuyoruz dediğinizi duyar gibiyim. Otomatik eşleştirme yaparken eğer convention sınıflarınızı default olarak kullanıyorsanız, otomatik eşleştirici eşleştirme yaparken örneğin; Id isimli integer tipindeki değişkeninizin otomatik olarak artış gösteren bir öncül anahtar(primary key) olduğunu anlaması gerekmektedir [2]. Aşağıdaki örnek ile otomatik eşleştirmenin yapılmasını sağlayan bazı kavramları öğreneceğiz.

 public class Yiyecek  
 {  
  public int Id { get; set; }  
  public virtual string Ad { get; set; }  
  public virtual decimal Fiyat { get; set; }  
 }  
 public class Buzdolabı  
 {  
  public virtual int Id { get; set; }  
  public virtual IList<Yiyecek> Yiyecekler { get; set; }  
 }  

Yukarıdaki kod ile one-to-many ilişkisi kurulmuştur. Bir buzdolabında birden fazla yiyecek bulunabilir. Otomatik eşleştirmemizi yapabilmemiz için Automap sınıfını, fluent konfigürasyon API kombinasyonu ile kullanmalıyız.

 AutoMap.AssemblyOf<T>  

Yukarıdaki kod parçası generic bir tip alan statik bir metottur. Otomatik eşleştirmenizi yapmak istediğiniz sınıfınızı T değişkeninin yerine yazmalısınız. İşte otomatik eşleştirme yapmak bu kadar kolay.  AutoMap.AssemblyOf<Yiyecek>  kodunu çağırdığınız zaman;  Yiyecek sınıfının tanımlandığı assembly'ye bağlanan AutoPersisteneceModel objesi üretilir [3]. Kullanacağımız SessionFactory'i yaratmak için aşağıdaki kod parçasını kullanmalıyız.

 var sessionFactory = Fluently.Configure()  
  .Database(/* database config */)  
  .Mappings(m =>  
   m.AutoMappings  
    .Add(AutoMap.AssemblyOf<Yiyecek>()))  
  .BuildSessionFactory();  

    Automapper, hangi sınıfın objeniz veya servisiniz olduğunu ayırt edemez. Bu yüzden ihtiyacımız olan final bir metot olan Where(Func)'i kullanmalıyız. Bu metot ile genellikle namespace sınırlaması konulur; ancak siz Type objesi ile istediğiniz sınırlamayı koyabilirsiniz [1]. Bu örnekte ben de namespace sınırlamasına ihtiyaç duyuyorum.


 var autoMappings = AutoPersistenceModel  
  .MapEntitiesFromAssemblyOf<Yiyecek>()  
  .Where(t => t.Namespace == "Mutfak.Entities");  
 var sessionFactory = new Configuration()  
  .AddProperty(ConnectionString, ApplicationConnectionString)  
  .AddAutoMappings(autoMappings)  
  .BuildSessionFactory();  

Yukarıdaki şekilde namespace sınırlamamızı koyduktan sonra otomatik eşleştirmemizi tamamlamış olduk. Gördüğünüz gibi yukarıdaki yapıyı kullanarak otomatik eşleştirme yapmak bu kadar basit.  Bu haftalık anlatacaklarım bu kadar. Bir sonraki hafta; isimlendirme sınıflarımızı kendimize göre nasıl uyarlayabileceğimizden bahseceğiz, hoşçakalın..

Kaynaklar


[1] Fluent NHibernate: Auto Mapping Introduction, http://www.jagregory.com/writings/fluent-nhibernate-auto-mapping-introduction/, Nisan 22, 2015.

[2]GETTING STARTED WITH FLUENT NHIBERNATE AND AUTO MAPPING IN C#, http://blog.json.codes/web-development/getting-started-with-fluent-nhibernate-and-auto-mapping-in-c/, Nisan 22, 2015.

[3] Auto mapping, https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping, Nisan 23, 2015.

Hiç yorum yok:

Yorum Gönder