24 Ekim 2022 Pazartesi

Entity

  • Entity, Pek çok nesne temelde attribütleriyle değilde, Uniq identity (Id)  ile tanımlanır. 
  • Uniq Identitysi ile tanımlanan nesneye Entity denir ve Entityler mutabledır.(Değişebilir).
  • Entityler compare edilirken Id'leri kontrol edilir. Eğer Idleri aynı ise eşit kabul edilirler. 



- 6. satır Entity sınıfını abstract olarak tanımlıyoruz. Hiç kimse bu Entity clasından bir nesne oluşturamasın.

- 12.satır Bir Entity yaratıldığında ve ona constructerda bir Id atandıktan sonra artık bu Id değerinin hiç bir zaman değiştirilememesini sağlamak için Id propertisinin set metodunu silip init yapıyoruz. Daha sonra private init yaparak bu Entitye Id ataması işlemini sadece bu Entity clası içerisinde yapılabileceğini garanti ediyoruz.


Entityler oluşturulurken zorunlu olan propertyler constructer üzerinden alınmalıdır. Diğer değerler metodlar aracılığıyla alınmalıdır. 



Yukarıdaki screen incelenirse eğer;

  • Id, FirstName ve LastName alanları requireddır. Required alan oldukları için bunları setlenme işlemi constructer üzerinden yapılmaktadır.
  • PhoneNumber ve CustomerId alanları value objecttir. CustomerId required iken PhoneNumber required değildir. Bu yüzden PhoneNumber alanını constructrdan almaya gerek yoktur. 
  • Constructer içerisinde FirstName ve LastName alanları için eğer nullsalar exception throw etmesi gerektiği kuralı yazılmıştır. Bu yüzden customer.FirstName = "aytac"; şeklinde bir set işlemi yapılmaması gerekmektedir. Eğer bu şekilde setleme işlemi yaparsak bu kuralı ihlal etmiş olacağız. Yani bu kuralı uygulamadan firstname yada lastname set etmiş olacağız. Bunu önlemek için set alanları private yapıyoruz. Artık bu alanların değerleri sadece bu customer sınıfı içerisinden yapıalabilecektir. Ve bu alanları update edebilmemizi sağlayacak UpdateNameAndLastName() metodu yazılmıştır. FirstName ve LastName alanları bu sınıf dışından  sadece bu metod kullanılarak update edilebilecektir.
  • Customer içerisinde PhoneNumber value objesini set etmek için bir metot yazmaya gerek yoktur. Çünkü PhoneNumbera ait gerekli validasyon PhoneNumbervalue object sınıfının içerisindeki static create metodu içerisinde zaten yazılmıştır.


PhoneNumber sınıfı içinde Constructer private yapıldığı için PhoneNumber nesnesini sadece kendisi içerisinde  newlenerek create edilebilir. Static ve geriye PhoneNumber dönen bir Create metoduyla PhoneNumber yaratılabilecektir ve bu Create metodu içerisinde PhoneNumber için gerekli bussiness rulelar yazılmıştır.

Customera ait phone number değerini set etmek için aşağıdaki gibi set etmek yeterli olacatır. Eğer Customer özelinde PhoneNumber için özel bussines rulelar uygulamamız gerekir o zaman PhoneNumberi set etmek için Customer sınıfı içerisinde bir metod yazabiliriz.





Domai Drive Desig Etitiy
  public abstract class Entity : IEquatable<Entity>
    {
        protected  Entity(Guid id)
        {
            Id = id;
        }
        protected Entity()
        {

        }
        public Guid Id { get; private init; }

        public override bool Equals(object? obj)
        {
            if(obj is null)
            {
                return false;
            }

            if(obj.GetType() != GetType())
            {
                return false;
            }

            if(obj is not Entity entity)
            {
                return false;
            }
            return entity.Id == Id;
        }

        public bool Equals(Entity? other)
        {
            if (other is null)
            {
                return false;
            }

            if (other.GetType() != GetType())
            {
                return false;
            }

            return other.Id == Id;
        }
        public override int GetHashCode()
        {
            return Id.GetHashCode();
        }

        public static bool operator ==(Entity? first, Entity? second)
        {
            return first is not null && second is not null && first.Equals(second); 
        }
        public static bool operator !=(Entity? first, Entity? second)
        {
            return !(first == second);
        }
    }

Hiç yorum yok:

Yorum Gönder