Command definition
من یک پروژه برای خودم تعریف کردم.
که یک موجودیت درونش یک لیستی از یک موجودیت دیگه داره. برای مثال یک شخص که لیستی از امور مالی داره.
اینا با هم رابطه دارن چون هر کدام یک موجودیته و اگریگت نیست.
حالا آیا این اصولی هست که من در کامند افزودن امور مالی به لیست امور مالی، امور مالی رو تعریف کنم؟
مثال :
; public record AddFinancialPersonCommand(long Id, Financial Financial) : IBaseCommand
که با آیدی فرد مدنظر رو پیدا کنم و بعد امورمالی که تازه ساخته شده یا از Query گرفته شده رو به لیست امور مالی اون فرد اضافه کنم.
پاسخ ها
محمد اشرافی
منظورتون رو درست متوجه نمیشم ولی فرقی نداره توی 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
{
}
گورگیز الیه
ببخشید فکر کنم سوال رو خوب مطرح نکردم
ساده بخوام بگم دقیقاًً همین مثالی که زدید فقط هر دو موجودیت از نوع AggregateRoot هستند.
پس این که یک موجودیت از نوع AggregateRoot رو میتونیم بعنوان ورودی Command یه AggregateRoot روت دیگه بدیم. و کارمون هم اصولی هستش. درسته؟
دلیل بوجود اومدن سوالم این بود که توی پروژه فروشگاه شما توی Domain خود موجودیت Address رو به ورودی AddAddress برای User قرار دادید ولی توی Application برای Command اضافه کردن Address به User مقادیری که به ورودی دادید، همون مقادیر تابع سازنده Address بودن.
برای همین این سوال برای من به وجود اومد که آیا کاری که من میخوام بکنم اصولی نیست؟ یا صرفاً بخاطر نحوه پیاده سازیه؟
چون من سعی میکنم اصول کد نویسی رو هم در کنار یادگیری برنامه نویسی یاد بگیرم.
محمد اشرافی
آها الان منظورتون رو گرفتم
- نه این کار خیلیی اشتباهی ه که از مدل های ِDomain برای ورودی command استفاده کنیم ( نه به عنوان ورودی و نه به عنوان خروجی نباید از مدل های domain استفاده کرد )
- اون کلاس Command که میسازیم نماینده اون use Case ه ، و به هیچ عنوان لایه وب کاری با مدل های domain نداره صرفا با command ها و query ها کار داره
- مدل های دامین صرفا برای منطق و هسته ی اصلی برنامه استفاده میشه که بتونیم اطلاعات رو به خوبی مدیریت کنیم
گورگیز الیه
پس در این صورت اگر من بخوام موجودیت رو از Query بگیرم و به Command بدم، باید تک تک property های اون رو توی ورودی Command قرار بدم و نمیتونم مستقیماً خود موجودیت رو به ورودی بدم. درست متوجه منظورتون شدم؟
محمد اشرافی
بله درسته (Query هم نباید اون موجودیت رو برگردونه باید Dto برگردونه)
گورگیز الیه
بسیار عالی، خیلی ممنون بخاطر وقتی که برای پاسخگویی گذاشتید.