کد ساز برای قالب پرتال
با استفاده از این کد ساز میتوانید از روی کلاس مدل همه ی لایه های پروژه را با یک دستور کد سازی کنید
https://github.com/codehaks/CodeGen-Core
با استفاده از این کد ساز میتوانید از روی کلاس مدل همه ی لایه های پروژه را با یک دستور کد سازی کنید
https://github.com/codehaks/CodeGen-Core
قالب پرتال
این قالب به صورت چند لایه و با استفاده از ASP MVC Core 2 پیاده شده است.
https://github.com/codehaks/Portal-Core-Fa
این لایه ها شامل UnitOfWork و Repositiry و Service میشود. برای هر مدلی که به پروژه اضافه میکنید این لایه ها باید پیاده شوند. کد نویسی این لایه ها نسبتا یکسان است و کدهای مشابه زیادی دارد. از این رو برای سرعت بخشیدن به روند کار یک کد ساز با استفاده از T4 ایجاد کردم که فایلهای ریپوزیتوری و سرویس ، ViewModel ها و همچنین کنترلر و ویوی هر قسمت را از روی کلاس Model می سازد.
جهت دانلود کد ساز به آدرس زیر مراجعه کنید
https://github.com/codehaks/CodeGen-Core
این قالب به صورت چند لایه و با استفاده از ASP MVC Core 2 پیاده شده است.
https://github.com/codehaks/Portal-Core-Fa
این لایه ها شامل UnitOfWork و Repositiry و Service میشود. برای هر مدلی که به پروژه اضافه میکنید این لایه ها باید پیاده شوند. کد نویسی این لایه ها نسبتا یکسان است و کدهای مشابه زیادی دارد. از این رو برای سرعت بخشیدن به روند کار یک کد ساز با استفاده از T4 ایجاد کردم که فایلهای ریپوزیتوری و سرویس ، ViewModel ها و همچنین کنترلر و ویوی هر قسمت را از روی کلاس Model می سازد.
جهت دانلود کد ساز به آدرس زیر مراجعه کنید
https://github.com/codehaks/CodeGen-Core
GitHub
codehaks/Portal-Core-Fa
Portal-Core-Fa - An opinionated project template for ASP.NET Core 2.0
روش استفاده از کد ساز
1- ابتدا باید برنامه را دانلود و بیلد کنید
2-مسیر برنامه را در Path در Windows Enviroments اضافه کنید تا همه جا از طریق CMD در دسترس باشد
3- کلاس مدل را ایجاد کنید
4-برنامه را در مسیر فولدر Models با استفاده از دستور gen اجرا کنید.
دقت کنید که ابتدا عبارت gen و بعد نام کلاس مدل و بعد نوع دستور و در انتها Area قرار میگیرد.
مانند gen product go admin
5- انواع دستور :
ایجاد همه ی فایلها به صورت یکجا : go
ایجاد ویود مدل : vm
ایجادسرویس : sr
ایجاد ریپوزیتوری : rp
ایجاد کنترلر : cr
ایجاد ویوها : vi
6- این کد ساز عملیات CRUD را به صورت خودکار پیاده میکند. بعد از پیاده سازی معمولا نیاز به انجام تغییرات کوچک دارید. مثلا ممکن است مدل شما نیاز به عملیات حذف نداشته باشد و میتوانید کدهای آن قسمت را بردارید. همینطور ویو ها ساده طراحی شده اند و شامل همه ی فیلدهای مدل میشوند.
7- هنوز کد ساز بعضی از کارها را انجام نمیدهد. مثلا باید خودتان سرویس را به Dependency Injection اضافه کنید یا مدلها و ویو مدلها را به AutoMapper اضافه کنید. این عملیاتها چندان وقتگیر نیست . امیدوارم در آینده ی نزدیک با استفاده از Roslyn این بخش را هم به پروژه اضافه کنم.
1- ابتدا باید برنامه را دانلود و بیلد کنید
2-مسیر برنامه را در Path در Windows Enviroments اضافه کنید تا همه جا از طریق CMD در دسترس باشد
3- کلاس مدل را ایجاد کنید
4-برنامه را در مسیر فولدر Models با استفاده از دستور gen اجرا کنید.
دقت کنید که ابتدا عبارت gen و بعد نام کلاس مدل و بعد نوع دستور و در انتها Area قرار میگیرد.
مانند gen product go admin
5- انواع دستور :
ایجاد همه ی فایلها به صورت یکجا : go
ایجاد ویود مدل : vm
ایجادسرویس : sr
ایجاد ریپوزیتوری : rp
ایجاد کنترلر : cr
ایجاد ویوها : vi
6- این کد ساز عملیات CRUD را به صورت خودکار پیاده میکند. بعد از پیاده سازی معمولا نیاز به انجام تغییرات کوچک دارید. مثلا ممکن است مدل شما نیاز به عملیات حذف نداشته باشد و میتوانید کدهای آن قسمت را بردارید. همینطور ویو ها ساده طراحی شده اند و شامل همه ی فیلدهای مدل میشوند.
7- هنوز کد ساز بعضی از کارها را انجام نمیدهد. مثلا باید خودتان سرویس را به Dependency Injection اضافه کنید یا مدلها و ویو مدلها را به AutoMapper اضافه کنید. این عملیاتها چندان وقتگیر نیست . امیدوارم در آینده ی نزدیک با استفاده از Roslyn این بخش را هم به پروژه اضافه کنم.
معرفی Razor Pages در ASP Core 2.0
ویوهای Razor Page با عبارت page@ در ابتدای صفحه مشخص میشوند و دارای پسوند cshtml هستند. در نگاه اول هیچ فرق اساسی بین ویوهای Razor و Razor Page دیده نمیشود. اما Razor Page ها دارای یک فایل کد پس زمینه هستند.
این فایل با پسوند cshtml.cs همنام با فایل Razor Page است و همراه آن ساخته میشود. این فایل نقش Code Behind را داراست. چیزی شبیه فایل کد مخصوص فرم در WinForm . شما می توانید عملیات های POST یا GET روی ویو را مستقیما در این فایل کد نویسی کنید و دیگر نیاز به کنترلر جدا ندارید.
سیستم Razor Page بخشی از MVC جدید ASP Core است و همزمان در کنار Controller ها قابل استفاده است. یعنی مجبور به استفاده یکی یا دیگری نیستید. اگر نیاز به ارسال پارامتر به ویو داشته باشید می توانید آن را درون Code Behind تعریف کنید و در View مقدار دهی کنید.
امکان استفاده از تزریق وابستگی و کنترل معکوس در Razor Pages وجود دارد و بر خلاف ظاهرش کاملا کاربردی است. به نحوی که شما می توانید بجای استفاده از سیستم MVC همیشگی کل پروژه های خود را با Razor Pages پیاده سازی کنید.
از مزایای اصلی Razor Page یکپارچه سازی کدهای هر قسمت و جمع کردن آنها درون یک فولدر است. در MVC مدلها ، ویوها و کنترلر ها هر کدام در فولدهای خودش قرار میگیرد که مدیریت کد را مشکل میکند.
این قابلیت جدید هنوز در ابتدای راه است و نمی توان گفت جای MVC را به طور کامل می گیرد اما گزینه ای است که برنامه نویسان ASP مدتها به دنبالش بودند.
ویوهای Razor Page با عبارت page@ در ابتدای صفحه مشخص میشوند و دارای پسوند cshtml هستند. در نگاه اول هیچ فرق اساسی بین ویوهای Razor و Razor Page دیده نمیشود. اما Razor Page ها دارای یک فایل کد پس زمینه هستند.
این فایل با پسوند cshtml.cs همنام با فایل Razor Page است و همراه آن ساخته میشود. این فایل نقش Code Behind را داراست. چیزی شبیه فایل کد مخصوص فرم در WinForm . شما می توانید عملیات های POST یا GET روی ویو را مستقیما در این فایل کد نویسی کنید و دیگر نیاز به کنترلر جدا ندارید.
سیستم Razor Page بخشی از MVC جدید ASP Core است و همزمان در کنار Controller ها قابل استفاده است. یعنی مجبور به استفاده یکی یا دیگری نیستید. اگر نیاز به ارسال پارامتر به ویو داشته باشید می توانید آن را درون Code Behind تعریف کنید و در View مقدار دهی کنید.
امکان استفاده از تزریق وابستگی و کنترل معکوس در Razor Pages وجود دارد و بر خلاف ظاهرش کاملا کاربردی است. به نحوی که شما می توانید بجای استفاده از سیستم MVC همیشگی کل پروژه های خود را با Razor Pages پیاده سازی کنید.
از مزایای اصلی Razor Page یکپارچه سازی کدهای هر قسمت و جمع کردن آنها درون یک فولدر است. در MVC مدلها ، ویوها و کنترلر ها هر کدام در فولدهای خودش قرار میگیرد که مدیریت کد را مشکل میکند.
این قابلیت جدید هنوز در ابتدای راه است و نمی توان گفت جای MVC را به طور کامل می گیرد اما گزینه ای است که برنامه نویسان ASP مدتها به دنبالش بودند.
دوره ی آموزشی مبانی برنامه نویسی در ASP Core
تعداد ویدیو ها : 25 قسمت
مدت زمان : یک ساعت و 56 دقیقه
حجم دانلود : 166 مگابایت
کیفیت فایها : 720p
فرمت فایلها : mp4
لینک دانلود : http://codehaks.com
تعداد ویدیو ها : 25 قسمت
مدت زمان : یک ساعت و 56 دقیقه
حجم دانلود : 166 مگابایت
کیفیت فایها : 720p
فرمت فایلها : mp4
لینک دانلود : http://codehaks.com
آشنایی با Anaemic Domain Model و Rich Domain Model
یک Anaemic Domain Model به مدلی (کلاس) گفته میشود که فقط دارای خصوصیات است و از خودش رفتاری ندارد. در واقع یک سری Property دارد بدون آنکه متدی درونش تعریف شده باشد.
طبیعی است که این نوع مدل ها امکان اعتبار سنجی از داده های خود را ندارند. معمولا وقتی از یک ADM استفاده می کنید لایه ی سرویس عملیات Validation ، Business Logic را انجام میدهد. که نتیجه اش داشتن لایه سرویس قطور با انبوه کد است.
در مقابل Rich Domain Model سهم بیشتری از عملیات را درون خود انجام میدهد و سعی می کند بر مبنای برنامه نویسی شی گرا حداکثر استفاده را از قابلیت های یک Class ببرد. در نتیجه Service Layer کوچکتر شده و یا ممکن است اصلا وجود نداشته باشد.
در بسیاری موارد ADM یک Anti-pattern شناخته میشود . مخصوصا اگر Business Logic در پروژه پیچیده باشد مدیریت کردن داده ها به صورت فرآیندی ( متدها) مشکل میشود. اما این مسئله مطلق نیست. اگر بخواهیم اصول SOLID را در برنامه نویسی در نظر بگیریم داشتن یک کلاس که همه کار انجام میدهد با اصلی که می گوید هر کلاس تنها و تنها باید مسئول انجام یک کار باشد در تضاد است.
در نهایت شما باید به هدف فکر کنید. باید بسنجید با توجه به شرایط موجود کدام روش مناسب است. آیا پروژه خود را بر اساس مفاهیم و الگوها پیاده می کنید یا از الگوها و مفاهیم برای پیاده سازی پروژه خود استفاده می کنید ؟
یک Anaemic Domain Model به مدلی (کلاس) گفته میشود که فقط دارای خصوصیات است و از خودش رفتاری ندارد. در واقع یک سری Property دارد بدون آنکه متدی درونش تعریف شده باشد.
طبیعی است که این نوع مدل ها امکان اعتبار سنجی از داده های خود را ندارند. معمولا وقتی از یک ADM استفاده می کنید لایه ی سرویس عملیات Validation ، Business Logic را انجام میدهد. که نتیجه اش داشتن لایه سرویس قطور با انبوه کد است.
در مقابل Rich Domain Model سهم بیشتری از عملیات را درون خود انجام میدهد و سعی می کند بر مبنای برنامه نویسی شی گرا حداکثر استفاده را از قابلیت های یک Class ببرد. در نتیجه Service Layer کوچکتر شده و یا ممکن است اصلا وجود نداشته باشد.
در بسیاری موارد ADM یک Anti-pattern شناخته میشود . مخصوصا اگر Business Logic در پروژه پیچیده باشد مدیریت کردن داده ها به صورت فرآیندی ( متدها) مشکل میشود. اما این مسئله مطلق نیست. اگر بخواهیم اصول SOLID را در برنامه نویسی در نظر بگیریم داشتن یک کلاس که همه کار انجام میدهد با اصلی که می گوید هر کلاس تنها و تنها باید مسئول انجام یک کار باشد در تضاد است.
در نهایت شما باید به هدف فکر کنید. باید بسنجید با توجه به شرایط موجود کدام روش مناسب است. آیا پروژه خود را بر اساس مفاهیم و الگوها پیاده می کنید یا از الگوها و مفاهیم برای پیاده سازی پروژه خود استفاده می کنید ؟
اصل حداقل شگفتی
در طراحی مهندسی Principle of least astonishment یا اصل حداقل شگفتی به تلاش برای عدم سورپرایز کردن کاربر سیستم تعریف میشود.
مثلا در سیستم عامل ویندوز وقتی دکمه ی F1 کیبورد را میزنید انتظار دارید که صفحه ی راهنما نرم افزار یا سیستم عامل را مشاهده کنید. اگر می خواهید اصل حداقل شگفتی را رعایت کرده باشید نباید برای F1 کاربرد دیگری تعریف کنید.
این اصل بیان می کند که کاربر سیستم باید با آن چیزی که انتظار دارد برخورد کند به طوریکه نیاز به راهنما نداشته باشد. با این تکنیک سرعت یادگیری کار با سیستم افزایش میابد و منابع کمتری برای آموزش هدر میرود.
این اصل در برنامه نویسی هم اهمیت زیادی دارد. کدها باید گویا باشد و متدها نباید به گونه ای رفتار کنند که کاربر (در اینجا برنامه نویس) را سردرگم کند. در واقع یک متد تنها باید کاری را انجام دهد که در اسمش آمده و نه هیچ کار دیگری. از طرف دیگر استفاده از تکنیک ها خلاقانه برای حل مشکل باید به حداقل برسد. وقتی در یک تیم کار می کنید یا افراد دیگری باید کدهای شما را بررسی کنند راه حل های غیر متعارف می تواند میزان پیچیدگی کد را بالا ببرد و فهم آن را برای همه مشکل کند.
در طراحی مهندسی Principle of least astonishment یا اصل حداقل شگفتی به تلاش برای عدم سورپرایز کردن کاربر سیستم تعریف میشود.
مثلا در سیستم عامل ویندوز وقتی دکمه ی F1 کیبورد را میزنید انتظار دارید که صفحه ی راهنما نرم افزار یا سیستم عامل را مشاهده کنید. اگر می خواهید اصل حداقل شگفتی را رعایت کرده باشید نباید برای F1 کاربرد دیگری تعریف کنید.
این اصل بیان می کند که کاربر سیستم باید با آن چیزی که انتظار دارد برخورد کند به طوریکه نیاز به راهنما نداشته باشد. با این تکنیک سرعت یادگیری کار با سیستم افزایش میابد و منابع کمتری برای آموزش هدر میرود.
این اصل در برنامه نویسی هم اهمیت زیادی دارد. کدها باید گویا باشد و متدها نباید به گونه ای رفتار کنند که کاربر (در اینجا برنامه نویس) را سردرگم کند. در واقع یک متد تنها باید کاری را انجام دهد که در اسمش آمده و نه هیچ کار دیگری. از طرف دیگر استفاده از تکنیک ها خلاقانه برای حل مشکل باید به حداقل برسد. وقتی در یک تیم کار می کنید یا افراد دیگری باید کدهای شما را بررسی کنند راه حل های غیر متعارف می تواند میزان پیچیدگی کد را بالا ببرد و فهم آن را برای همه مشکل کند.
در ASP Core یک سیستم تزریق وابستگی کم حجم و ساده پیاده شده است که نیاز به استفاده از سایر IoC ها از قبیل StructureMap و Ninject یا AutoFac را از بین میبرد. به طور کلی می توان به سه روش کلاسها (سرویسها) را در این فریم ورک تزریق کرد.
1- حالت Transient
در این روش سرویس در هربار که فراخوانی شود ایجاد میشود.
2- حالت Scoped
در این روش سرویس به ازای هر Request تنها یکبار ایجاد میشود.
3- حالت Singleton
در این روش سرویس تنها در اولین فراخوانی ایجاد میشود و در دفعات بعد از همان سرویس استفاده میشود.
1- حالت Transient
در این روش سرویس در هربار که فراخوانی شود ایجاد میشود.
2- حالت Scoped
در این روش سرویس به ازای هر Request تنها یکبار ایجاد میشود.
3- حالت Singleton
در این روش سرویس تنها در اولین فراخوانی ایجاد میشود و در دفعات بعد از همان سرویس استفاده میشود.
کنترلر در ASP Core
در ASP NET Core یک کلاس درصورتی به عنوان کنترلر شناخته میشود که حداقل دارای یکی از شرایط زیر باشد.
1- نام کلاس دارای پسوند Controller باشد
2- از کلاسی ارث بری کند که آن کلاس دارای پسوند Controller باشد.
3- با اتریبیوت [Controller] مشخص شده باشد.
همچنین نباید دارای اتریبیوت [NonController] باشد.
در ASP NET Core یک کلاس درصورتی به عنوان کنترلر شناخته میشود که حداقل دارای یکی از شرایط زیر باشد.
1- نام کلاس دارای پسوند Controller باشد
2- از کلاسی ارث بری کند که آن کلاس دارای پسوند Controller باشد.
3- با اتریبیوت [Controller] مشخص شده باشد.
همچنین نباید دارای اتریبیوت [NonController] باشد.