Command definition

گورگیز الیه
17 اسفند ۱۴۰۰

من یک پروژه برای خودم تعریف کردم.
که یک موجودیت درونش یک لیستی از یک موجودیت دیگه داره. برای مثال یک شخص که لیستی از امور مالی داره.
اینا با هم رابطه دارن چون هر کدام یک موجودیته و اگریگت نیست.
حالا آیا این اصولی هست که من در کامند افزودن امور مالی به لیست امور مالی، امور مالی رو تعریف کنم؟

مثال :
; public record AddFinancialPersonCommand(long Id, Financial Financial) : IBaseCommand
که با آیدی فرد مدنظر رو پیدا کنم و بعد امورمالی که تازه ساخته شده یا از Query گرفته شده رو به لیست امور مالی اون فرد اضافه کنم.

318

6 پاسخ
  • محمد اشرافی17 اسفند ۱۴۰۰

    منظورتون رو درست متوجه نمیشم ولی فرقی نداره توی command چی دریافت کنید ، در نهاییت این aggregate Root ه که باید دیتارو مدیریت کنه و اضافه شون کنه

    مثال : 

    public class Course:AggregateRoot
    {
    	public List<CourseSection> Sections {get;set;}
    	
    	public void AddSection(Section section)
    	{
    		//Add Section
    	}
    	public void AddEpisodeToSection(Episode episode)
    	{
    		var section=Sections.FirstOrDefault(f=>f.Id==episode.SectionId);
    		if(section==null)
    			return;
    			
    		section.addEpisode(episode);
    	}
    }
    public class CourseSection:Entity
    {
    	public List<Episode> Episodes {get;set;}
    	
    	public void AddEpisode(Episode episode)
    	{
    		//logic
    		
    		Episodes.add(episode);
    	}
    }
    public class Episode:Entity
    {
    
    }
  • گورگیز الیه18 اسفند ۱۴۰۰

    ببخشید فکر کنم سوال رو خوب مطرح نکردم
    ساده بخوام بگم دقیقاًً همین مثالی که زدید فقط هر دو موجودیت از نوع AggregateRoot هستند.

    پس این که یک موجودیت از نوع AggregateRoot رو میتونیم بعنوان ورودی Command یه AggregateRoot روت دیگه بدیم. و کارمون هم اصولی هستش. درسته؟


    دلیل بوجود اومدن سوالم این بود که توی پروژه فروشگاه شما توی Domain خود موجودیت Address رو به ورودی AddAddress برای User قرار دادید ولی توی Application برای Command اضافه کردن Address به User مقادیری که به ورودی دادید، همون مقادیر تابع سازنده Address بودن.
    برای همین این سوال برای من به وجود اومد که آیا کاری که من میخوام بکنم اصولی نیست؟ یا صرفاً بخاطر نحوه پیاده سازیه؟

    چون من سعی میکنم اصول کد نویسی رو هم در کنار یادگیری برنامه نویسی یاد بگیرم.

  • محمد اشرافی18 اسفند ۱۴۰۰

    آها الان منظورتون رو گرفتم

    1. نه این کار خیلیی اشتباهی ه که از مدل های ِDomain برای ورودی command استفاده کنیم ( نه به عنوان ورودی و نه به عنوان خروجی نباید از مدل های domain استفاده کرد )
    2. اون کلاس Command که میسازیم نماینده اون use Case ه ، و به هیچ عنوان لایه وب کاری با مدل های domain نداره صرفا با command ها و query ها کار داره
    3. مدل های دامین صرفا برای منطق و هسته ی اصلی برنامه استفاده میشه که بتونیم اطلاعات رو به خوبی مدیریت کنیم 
  • گورگیز الیه18 اسفند ۱۴۰۰

    پس در این صورت اگر من بخوام موجودیت رو از Query بگیرم و به Command بدم، باید تک تک property های اون رو توی ورودی Command قرار بدم و نمیتونم مستقیماً خود موجودیت رو به ورودی بدم. درست متوجه منظورتون شدم؟

  • محمد اشرافی18 اسفند ۱۴۰۰

    بله درسته (Query هم نباید اون موجودیت رو برگردونه باید Dto برگردونه)

  • گورگیز الیه18 اسفند ۱۴۰۰

    بسیار عالی، خیلی ممنون بخاطر وقتی که برای پاسخگویی گذاشتید.