Post Page Advertisement [Top]

     Merhaba,
      Bu yazımda daha önceki yazılarla devam ettirdiğimiz Joker Games projesinin Infrasturcure aşamasındayız. Bu aşamada her bir modelimiz için gerekli olan CRUD işlemlerini sağlayacak Respository sınıflarını yazacağız. Burada her bir model için bir repository yazmak yerine genel bir sınıf yazıp tüm modellerimizin bu sınıfı kullanarak CRUD işlemleri yapabilmesini sağlayacağız.


      Örneğin PlayerRepository, CardRepository vb. yerine sadece GenericRepository isiminde bir repository' miz olacak Application  katmanında ise Application Service'lerimiz her model için ayrılmak zorunda çünkü projenin iş kuralları her bir model için ayrı ayrı burada olacak. Bunu da PlayerService, CardService vb. sınıflar ile yapacağız.

Okurken ne dinlemeli ?

     
        Joker Games projemizi anlamak ve en baştan takip etmek için bir önceki yazımı buradan okuyabilirsiniz. Generic Yapımızı oluşturmak için ilk olarak Infrastructure adında Solution File oluşturalım ve Repository adında bir Class Library projesi ekleyelim.

Create, Update, Delete ve Select işlemleri için oluşturacağımız sınıfımızın interface'si aşağıdaki şekilde olacaktır.

public interface IGenericRepository<T> where T : class
    {
        bool Add(T entity);
        bool Add(IEnumerable<T> items);
        bool Update(T entity);
        bool Delete(T entity);
        bool Delete(IEnumerable<T> entities);
        T FindBy(int id);
        T FindBy<TV>(TV id);
        IQueryable<T> All();
        T FindBy(Expression<Func<T, bool>> expression);
        IQueryable<T> FilterBy(Expression<Func<T, bool>> expression);

    }

Görüldüğü gibi metodlarımız T türünden generic bir obje almaktadır. NHibernate Session nesnesini kullanacağımız için bu projemize Fluent NHibernate nuget paketi eklemeliyiz.

            Install-Package FluentNHibernate

Generic Repository class' ımız aşağıdaki gibi olacaktır.


public class GenericRepository<T> : IGenericRepository<T> where T : class
    {
        private readonly ISession _session;

        public GenericRepository(ISession session)
        {
            _session = session;
        }

        public bool Add(T entity)
        {
            _session.Save(entity);
            _session.Flush();
            return true;
        }

        public bool Add(IEnumerable<T> items)
        {
            foreach (T item in items)
            {
                _session.Save(item);
            }
            _session.Flush();
            return true;
        }

        public bool Update(T entity)
        {
            _session.Update(entity);
            _session.Flush();

            return true;
        }

        public bool Delete(T entity)
        {
            _session.Delete(entity);
            _session.Flush();
            return true;
        }

        public bool Delete(IEnumerable<T> entities)
        {
            foreach (T entity in entities)
            {
                _session.Delete(entity);
            }
            _session.Flush();
            return true;
        }

        public T FindBy(int id)
        {
            _session.CacheMode = CacheMode.Normal;
            return _session.Get<T>(id);
        }

        public T FindBy<TV>(TV id)
        {
            return _session.Get<T>(id);
        }

        public IQueryable<T> All()
        {
            return _session.Query<T>();
        }

        public T FindBy(Expression<Func<T, bool>> expression)
        {
            return FilterBy(expression).FirstOrDefault();
        }

        public IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
        {
            return All().Where(expression).AsQueryable();
        }


    }

        Böylece Infrasturcture katmanını tamamlamış oluyoruz. Şimdi Application adında bir Solution File oluşturup Application Service isminde proje ekleyelim ve domain servislerini yazmaya başlayalım. Player Servisi ile başlayalım ileride web projemize DI (Dependency Injection) yapacağımız için her servisin öncelikle interface'sini oluşturalım.
       
    public interface IPlayerService
    {
        bool AddPlayer(Player item);
        bool DeletePlayer(Player item);
        List<Player> GetPlayers();
        Player GetPlayer(int id);

    }

      Servis metodlarımızı yazacak olursak her servis metoduna Constructor DI ile yukarıda yazmış olduğumuz Generic Repository'i inject ediyoruz. Eklemek istediğimiz iş kuralları varsa bu aşamada kodluyoruz. (DDD)

          public class PlayerService: IPlayerService
      {
        private readonly IGenericRepository<Player> _repository;

        public PlayerService(IGenericRepository<Player> repository)
        {
            _repository = repository;
        }

        public bool AddPlayer(Player item)
        {
            return _repository.Add(item);
        }

        public bool DeletePlayer(Player item)
        {
            return _repository.Delete(item);
        }

        public List<Player> GetPlayers()
        {
            return _repository.All().ToList();
        }

        public Player GetPlayer(int id)
        {
            return _repository.FindBy(id);
        }
    }

Fazla karışık bir iş akışımız olmadığı için sadece repository'i kullanmak bizim için yeterli şimdilik. Örneğin CardSerice.cs'de AddCard metodunda kart numarasını başka bir web servise ,API vb. gönderip doğruluğunu sorgulayabilirdik. Bu aşamada bu çağrımları yaparak Web Projesnin contorller'ini sade tutmaya çalışıyoruz. ilerleyen yazımızda Web Projesinde daha detaylı anlatacağım fakat şimdi daha net olması açısından web projemizdeki HomeController' de bulunun Player metoduna bakarsak aşağıdaki gibi sade olduğunu göreceğiz. DI vasıtası ile PlayerService' nin kullanıldığını göreceğiz.


        [HttpPost]
        public IActionResult Player(PlayerModel request)
        {
            Player player=request.ToEntity();
            _playerService.AddPlayer(player);

            ViewBag.Message = "Success.";

            return View();

        }

Böylece Application katmanına giriş yaptık ve Application Service' imizi oluşturduk. Generic Repository Pattern' i kullanarak zaman kazandık, kodumuzun okunabilirliği arttı. Bir sonraki yazımda görüşmek üzere. Uygulama kodu her zamanki gibi burada.

Hoşça kalın.





Hiç yorum yok:

Yorum Gönder

Bottom Ad [Post Page]