Post Page Advertisement [Top]

     Merhaba,
     Bu yazımda Fluent Migrator ile oluşturduğumuz veri tabanını kullanarak Domain Driven Design yaklaşımında Fluent Nhibernate ORM' ini kullanan bir websitesi yapacağız.
     Bilindiği üzere ORM yani Object-Relational Mapping veri tabanında oluşan her bir nesneye (tabloya) object oriented dillerde bir nesneye (class) denk getirilmesidir. Böylece CRUD (Create,  Read, Update, Delete) işlemlerini kod tarafında yapabiliriz. Örneğin SQL için Store Procedure yazmamıza gerek kalmaz.


     Fluent NHibernate ise klasik NHibernate' ye kıyasla büyük avantaj sunuyor. Class mapping bilgilerini .hbm uzantılı XML dosyalarında saklamak yerine code behind ile halletmemize olanak sağlıyor. Bu da ORM tool'una data işlemlerinde hız kazandırıyor. Fluent Nhibernate ile artık Linq sorguları da yazabiliriz. EF (Entity Framework) tarafında Code First yaklaşımına oldukça benzer.

Okurken ne dinlemeli ?


 
 Anlatacağım proje bir çok konuyu içinde barındırıyor. İlk adımda Fluent Migrator ile veritabanını oluşturduk. Şimdi Fluent Nhibernate ile object-model ilişkisini gerçekleştireceğiz. Diğer bir konumuz ise Generic Repository olacak. Ve web projemizi yazarken de DDD yaklaşımına göre yazacağız. Web sitemiz de MVC olacak.

    İlk olarak senaryomuzdan bahsedelim: JokerGames bir oyun platformu oyuncular üye olarak oyun satın alıp oynayabilirler. Bunu için Players , oyuncuların sahip olduğu Cards ve satın alımların tutulduğu Purchases tablolarından başlayabiliriz. Bu tabloları önceki yazımızda Fluent Migrator ile oluşturduk. Şimdi Domain altında Entity'lerimizi oluşturalım ve Fluent NHibernate kullanarak mapping' lerini tamamlayalım.
    .Net Core 2.2 Web Projemizi oluşturarak başlayabiliriz.



        Projemizi oluşturduktan sonra Domain ,Infrasturcture ve  Application olmak üzere üç tane Solution File ekleyelim ve Entities adındaki projeyi Domain klasörünün altında oluşturalım. Bundan sonra oluşturacağımız tüm proje türleri Class Library şeklinde olacak.


      Entities projesi bizim veri tabanında oluşturduğumuz tablolara denk gelen sınıflar olacaktır. Card sınıfını incelersek: içinde kendi property'lerinin yanında Foreign Key'ler için gerekli olan property'leri de barındırdığını göreceğiz. Aşağıdaki örnek için Id ve Number kendi özelliği iken Player özelliği PlayerId FK' sından geliyor.


    public class Card
    {
        public virtual int Id { get; set; }
        public virtual string Number { get; set; }
        public virtual Player Player { get; set; }
    }


     Çünkü ORM' de her şeyi ilişkisel nesne olarak düşünmeli aralarındaki FK ilişkilerine göre Card nesnesini çektiğimizde ilgili Player nesnesinin de olacağını düşünmeliyiz. Bazen ilişkisel nesnemiz bir one to many ya da many to many DB ilişkisinden dolayı Liste property'ler de içerebilir. Bu projede yok fakat örnek olması için Player sınıfında bir liste property'si yorum satırı olarak ekledim. Player'ı çektiğimizde ilişkili birden çok kartı olabileceği için Cards adında bir liste property'si olabilir.


        public Player()
        {
           // Cards = new HashSet<Card>();
        }
        public virtual int Id { get; set; }
        public virtual string Username { get; set; }
        //public virtual ISet<Card> Cards { get; set; }

    
Purchase sınıfı:
    public  class Purchase
    {
        public virtual int Id { get; set; }
        public virtual decimal Amount { get; set; }
        public virtual Card Card { get; set; }
        public virtual Player Player { get; set; }
    }

Şimdi Domain katmanına Mapping projesi oluşturalım ve Fluent Nhibernate mapping'lerini yazalım:İlk olarak Fluent Nhibernate nuget paketini projemize aşağıdaki komut ile ekleyelim sonra da Entities projesini referans alalım.

 Install-Package FluentNHibernate

Mapping sınıflarımız aşağıdaki gibi olacaktır:

        public CardMap()
        {
            Table("Cards");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Number);
            References(x => x.Player).Column("PlayerId").Not.Nullable();

        }

        public PlayerMap()
        {
            Table("Players");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Username).Length(50).Not.Nullable();
            //HasMany(x => x.Cards).Cascade.All().KeyColumn("CardId");
        }

        public PurchaseMap()
        {
            Table("Purchases");
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.Amount);
            References(x => x.Player).Column("PlayerId").Not.Nullable();
            References(x => x.Card).Column("CardId").Not.Nullable();

        }


Domain katmanımız aşağıdaki gibi olacaktır.


Bir sonraki yazımızda Generic Repository kullanarak CRUD işlemlerimizi gerçekleştireceğiz bunu için Infrasturcture katmanını yazacağız. Bir sonraki yazımızda görüşmek üzere.

Hoşça kalın,
Sağlıkla Kalın.

Hiç yorum yok:

Yorum Gönder

Bottom Ad [Post Page]