Razor Class Library چیست؟

خب سلام. امروز می خوایم یکم درباره razor class library ها صحبت کنیم.

razor class library اصلا چیه؟

یک library برای asp.net core هست که می تونه شامل pages(razor pages) ، Views ، viewComponents ،controllers و ... بشه. (یک نکته ای که وجود داره اینه که library ها بصورت مستقل اجرا نمیشن (یک فایل dll بهمون میدن و dll اجرایی نیست) بلکه باید داخل یک برنامه دگ استفاده بشن).

کلا RCL (razor class library) کار ما رو برای استفاده مجدد از کدهامون ساده میکنه. نکته جالبی که دربارش وجود داره اینه که برنامه ای که داره از یک RCL استفاده میکنه ، این امکان رو داره که view ها (وقتی که بر اساس mvc نوشته شده) و pages ها (وقتی که بر اساس razor pages نوشته شده) رو override کنه. وقتی که یک view یا یک razor page هم در برنامه ما و هم در RCL موجود باشه ، از اون نسخه ای که در برنامه ما هست استفاده میشه .

ایجاد پروژه Razor Class Library

خب برای ایجاد یک پروژه razor class library توی ویژوال استدیو ، مطابق شکل های زیر عمل می کنیم.

(RCL توی Asp.net core 2.1 اومد و قاعدتا توی نسخه های قبلی نمیشه ازش استفاده کرد)

خب ، نوع پروژه رو razor class library انتخاب میکنیم. بعدش نام پروژه و نام solution رو ست میکنیم و میریم برای مرحله بعد.

خب حالا به تصویر پایین نگاه کنید.

توی قسمت 1 که نوشتم که مشخصه و ورژن دات نت رو انتخاب می کنیم. ولی اون تیک قسمت 2 رو بنا به نیاز میتونیم بزنیم یا نزنیم.

حالا ماجرای این تیک چیه؟ بصورت پیشفرض RCL از razor pages پشتیبانی میکنه. اگر بخواید از views (MVC) هم استفاده کنید ، باید این تیک رو بزنید (هر دو فعال میشن یعنی هم میتونید razor pages استفاده کنید و هم mvc).

خب ، بعد از create زدن ، یک پروژه ای مثل شکل زیر برای ما ایجاد میکنه.

خب چون من میخوام از MVC استفاده کنم ، پاک میکنم پوشه Areas رو.

خب در ابتدا یک پوشه با نام Controllers و یک پوشه با نام views ایجاد میکنم. همینطور برای Assets های مورد استفادم هم پوشه ای با نام wwwroot ایجاد میکنم.

داخل پوشه کنترلر ها ، یک کنترلر با نام sample ایجاد میکنم و view مربوط به اکشن index این کنترلر رو هم در پوشه views ایجاد میکنم.

ساختار تا اینجای کار ، همچین حالتی داره

و کنترلر Sample هم به این فرم هست.

و view مربوط به اکشن index هم بدین فرمه


خب حالا فرض کنید تا همینجا کافیه. بریم از این RCL ای که ساختیم استفاده کنیم.

توی همین سلوشن ، یک پروژه Asp.net Core ای ایجاد می کنم با نام DemoRCL.Web.

حالا روی Dependecies پروژه ایجاد شدم کلیک راست میکنم و Add projects references رو میزنم و رفرنس میدم به DemoRCL (یعنی همون Razor class library که ایجادش کردیم).

حالا پروژه وبی ایجاد شده رو set as startup میکنم (روی پروژه کلیک راست کنید ، گزینه ای با همین نام وجود داره).

پروژه رو ران میکنم. با صفحه زیر مواجه میشیم.

توی قسمت URL میام و

/sample/index

رو وارد میکنم (بر اساس default route خود mvc).نتیجه در تصویر پایین اومده.

ریکوست هدایت شده به اون کنترلر و اکشن داخل RCL و View هم ، همونی هست که خودمون نوشتیم. نکته ای که وجود داره این هست که از layout خود پروژه وب من استفاده کرده (توی RCL من براش layout ست نکردم و علت این مورد همینه)

اگر الان ما بریم توی پوشه Views مربوط به RCL و یک پوشه به اسم shared بسازیم و layout براش ایجاد کنیم ، باز هم از این layout استفاده نمیشه . توی اوایل همین مقاله بود که گفتم که اگر دو چیز هم نام ،توی RCL و پروژه وب ما وجود داشته باشه ، میاد و نسخه ای که توی پروژه وب ما هست رو استفاده میکنه.

خب الان من بجای استفاده از اسم مرسوم Layout_، از LayoutRCL_ استفاده میکنم.


و view مربوط به index رو هم بصورت زیر تغییر میدم.

حالا پروژه رو ران میکنم و میرم به

/sample/index

و میبینیم که تغییر در layout اعمال شد


بزارید یک مثال دگ درباره همین قضیه override شدن view ها و page ها بزنم.

خب توی RCL توی پوشه views ، ما یک پوشه به اسم sample داریم که یک فایل index.cshtml توشه و از این استفاده داریم میکنیم توی RCL.

حالا من میام دقیقا یک پوشه با همین نام و یک فایل با همین نام داخل پوشه views ولی در پروژه وبی خودم ایجاد میکنم.

و داخلش هم یک متن ساده مینویسم (متن : این پیغام از سمت پروژه وب است).

حالا وقتی برنامه رو ران میکنم و میرم سراغ

/sample/index

این دفعه دگ از View داخل RCL استفاده نمیکنه بلکه میاد و از view داخل خود پروژه وبی ما استفاده میکنه.

خب این فولدر sample که ایجاد کردم رو پاک میکنم .

خب حالا میخوام Dependency Injection رو نشون بدم. اینجا هم فرقی نداره . یک پوشه Models توی RCL ایجاد میکنم. توش یک کلاس تحت نام UserDataOptions ایجاد میکنم. (قصد دارم از option pattern استفاده کنم).

خب حالا به startup پروژه وبی خودم میرم و یک تغییراتی توش اعمال میکنم.

خب تغییرات اعمال شده توی اون قسمتی هست که دورش خط قرمز کشیدم .(اگر با options pattern اشنا نیستید روی این لینک کلیک کنید)

خب یک تغییری هم توی appsetting میدم.

حالا توی SampleController ، در پروژه RCL رو بصورت زیر تغییر میدم.

حالا اگر یک بریک پوینت بزارم توی کانستراکتور این کنترلر ، میتونم ببینم که inject بدرستی انجام شده.


خب حالا یک نکته دگ بگم و بحث رو ببندم (حداقل برای الان )

میخوام از یک تصویر داخل RCL استفاده کنم. یکم این مورد متفاوت هست (بطور کلی استفاده از Assets ها)

خب من یک پوشه درست کرده بودم توی پروژه RCL خودم بنام wwwroot. داخل اون یک فولدر دگ ایجاد میکنم به اسم RCLImages و داخل اون هم یک عکس قرار میدم.

اصلا با موس نمیشه خط درست درمون کشید:)
اصلا با موس نمیشه خط درست درمون کشید:)

خب حالا عکس رو میخوام توی صفحه index پروژه RCL نشونش بدم. صفحه رو بصورت زیر تغییر میدم

یکم عجیبه مسیر دهی من؟ خب دلیل داره. وقتی که پروژه publish میشه ، تمام assets های داخل پروژه هایی که بهشون رفرنس داریم ، کپی میشن توی فولدر wwwroot اصلی و توی پوشه ای با نام Content_ و یک پوشه هم با نام اون library ایجاد میشه و تمام assets ها داخلش قرار میگیرن. بزارید نشون بدم.

اگر پروژه وب رو پابلیش کنید. بعد به پوشه wwwroot ایجاد شده برید.اون موقع با یک همچین چیزی مواجه میشید.


که اگر پوشه Content_ رو باز کنید ، اون موقع با پوشه ای که هم نام با RCL شما هست روبرو میشید و در داخل اون، تمام فایل ها و فولدر های موجود در پروژه RCL و در فولدر wwwroot بود ، قرار دارن.

خب یادم رفت نتیجه کدی که نوشته بودیم رو نشون بدم.

نتیجه اون در پایینه

چیز های زیاد تری وجود داره ک اگر عمری بود در قسمت های بعدی میگم.

پروژه رو روی گیت هابمم قرار دادم.(این لینک). توی پروژه گیت هابمم ، یک نمونه از override کردن یک فرم و نتیجه اون فرم رو هم قرار دادم

موفق باشید.


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

https://t.me/DotNetZoom