الگوی Aggregate Root در #C

دوشنبه 9 آذر 1394

الگوی Aggregate Root یک دسته یا گروهی از اشیا است که رفتاری مانند یک واحد دیتا دارد .بسیاری از برنامه نویسان بدون این که بدانند از این الگو استفاده می کنند . در این مقاله به شرح این الگو خواهیم پرداخت.

الگوی Aggregate Root در #C

الگوی Aggregate Root یک دسته یا گروهی از اشیا است که رفتاری مانند یک واحد دیتا دارد .بسیاری از برنامه نویسان بدون این که بدانند از این الگو استفاده می کنند .

همان طور که می دانید رابطه Aggregate یک رابطه بین یک کل و یک جز است . در این رابطه یک کلاس مثلا کلاس مشتری می تواند شامل نمونه هایی از کلاس های دیگر باشد.کلاس مشتری می تواند شامل کلاس آدرس ، کلاس ماشین و یا ...باشد.در رابطه Aggregate کلاس جز به کلاس کل وابسته نیست و به تنهایی هم موجودیت دارد .یعنی اگر کلاس کل از بین برود اجزا از بین نمی روند و این طور هم نیست که با به وجود آمدن کلاس کل اجزا هم به وجود آیند .

برای توضیح بهتر مثالی می آوریم .کلاس مشتری زیر را در نظر بگیرید که قابلیت اضافه شدن چندین آدرس به یک شخص خاص را دارد .برای اینکه یک ارتباط یک به چند بین کلاس مشتری و کلاس آدرس وجود داشته باشد یک کالکشن از آدرس در کلاس مشتری تعریف می کنیم .

class Customer
{
        public string CustomerName { get; set; }
        public DateTime DateofBirth { get; set; }

        public List<Address> Addresses { get; set; }

}

class Address
{
        public string Address1 { get; set; }
        public string Type { get; set; }
}

کد بالا به خوبی کار خواهد کرد و شما می توانید با افزودن یک مشتری چندین آدرس به آن اضافه کنید.

Customer cust = new Customer();
cust.CustomerName = "Shiv koirala";
cust.DateofBirth = Convert.ToDateTime("12/03/1977");

Address Address1 = new Address();
Address1.Address1 = "India";
Address1.Type = "Home";
cust.Addresses.Add(Address1);

Address Address2 = new Address();
Address2.Address1 = "Nepal";
Address2.Type = "Home";
cust.Addresses.Add(Address2);

حال اگر بخواهیم که این حالت را پیاده سازی کنیم که هر مشتری تنها بتواند یک نوع از Home را داشته باشد چه کاری باید انجام دهیم ؟

یک متد Add می نویسیم که بتواند آدرس را به مشتری اضافه کند

cust.Addresses.Add(Address2);

در زیر سه مرحله ای که برای پیاده سازی این کار است آورده شده است .

مرحله 1 : Address List را به صورت Private تعریف می کنیم .بنابراین هیچ دسترسی مستقیمی به این لیست وجود نخواهد داشت.

مرحله 2 : در کلاس Customer یک متدی به نام Add اضافه می کنیم .در این متد یک Validation برای اینکه تنها یک Home در آدرس ثبت کنید

مرحله 3:برای کاربرانی که قصد شمارش در مجموعه آدرس را دارند از اینترفیس IEnumerable (نحوه به کار گیری IEnumerable را در لینک IEnumerable و IQueryable در سی شارپ آن مشاهده کنید)استفاده خواهیم کرد.

class Customer
    {
	// Code removed for clarity
        private List<Address> _Addresses; // Step 1 :- Make list private


        public void Add(Address obj) // Step 2 :- Address objects added via customer
        {
            int Count=0;
            foreach (Address t in _Addresses)
            {
                if (t.Type == "Home")
                {
                    Count++;
                    if (Count > 1)
                    {
                        throw new Exception("Only one home address is allowed");
                    }
                }
            }
            _Addresses.Add(obj);
        }

        public IEnumerable<Address> Addresses // Step 3 :- To browse use enumerator
        {
            get { return _Addresses; }
        }

    }

در کد بالا مشتری در ریشه یا Root قرار دارد و آدرس از آن منشعب شده است .چرا به این صورت است چون هر دو کلاس آدرس و مشتری در مجموع به عنوان یک داده در نظر گرفته می شوند .تغییراتی که قرار است بر روی آدرس اتفاق بیافتد از طریق کلاس مشتری صورت خواهد گرفت .

وقتی کلاس مشتری را از دیتابیس لود می کنیم تمام اشیا متناسب با Address هم لود می شوند.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 1 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید