Jon P. Smith, author of Entity Framework Core in Action, explains what a multi-tenant app is and then digs into the things you need to do to make a multi-tenant app using ASP.NET Core with EF Core.
00:00 Countdown
02:19 Introduction and Community Links
18:25 What are multi-tenant web applications?
21:14 Single level multi-tenant demo
29:00 Partitioning tenants with EF Core QueryFilter
38:00 Admin features: creating users and tenants
43:00 Q&A
43:00 Hierarchical multi-tenant
59:00 How to get started
1:06:30 Database sharding and connection string management
1:16:30 Scaling with Azure SQL Elastic Pools
1:19:00 Conclusion
آموزش Prism #1
- MVVM Light
- Prism
- Caliburn
- Cinch
- WAF
- Catel
- Onyx
- MVVM helpers
- و...
هر کدوم از فریم ورکهای بالا مزایا، معایب و طرفداران خاص خودشون رو دارند(^) ولی به جرات میتونیم Prism رو به عنوان قویترین فریم ورک برای پیاده سازی پروژهای بزرگ و قوی و ماژولار با تکنولوژی WPF یا Silverlight بنامیم. در این پست به معرفی و بررسی مفاهیم اولیه Prism خواهیم پرداخت و در پستهای دیگر به پیاده سازی عملی همراه با مثال میپردازیم.
*اگر به هر دلیلی مایل به یادگیری و استفاده از Prism نیستید، بهتون پیشنهاد میکنم از WAF استفاده کنید.
پیش نیازها:
برای یادگیری PRISM ابتدا باید با مفاهیم زیر در WPF یا Silverlight آشنایی داشته باشید.(فرض بر این است که به UserControl و Xaml و Dependency Properties، تسلط کامل دارید)
- Data binding
- Resources
- Commands
- Behaviors
چرا Prism ؟
- Prism به صورت کامل از Modular Programming برای پروژههای WPF و Silverlight پشتیانی میکند*
- از Prism هم میتوانیم در پروژههای WPF استفاده کنیم و هم Silverlight.
- Prism به صورت کامل از الگوی MVVM برای پیاده سازی پروژهها پشتیبانی میکند.
- پیاده سازی مفاهیمی نظیر Composite Command و Command Behavior و Asynchronous Interacion به راحتی در Prism امکان پذیر است.
- مفاهیم تزریق وابستگی به صورت توکار در Prism فراهم است که برای پیاده سازی این مفاهیم به طور پیش فرض امکان استفاده از UnityContainer و MEF در Prism تدارک دیده شده است.
- پیاده سازی Region navigation در Prism به راحتی امکان پذیر است.
- به وسیله امکان Event Aggregation به راحتی میتوانیم بین ماژولهای مختلف ارتباط برقرار کنیم.
*توضیح درباره برنامههای ماژولار
در تولید پروژهای نرم افزاری بزرگ هر چه قدر هم اگر در تهیه فایلهای اسمبلی، کلاس ها، اینترفیسها و کلا طراحی پروژه به صورت شی گرا دقت به خرج دهیم باز هم ممکن است پروژه به صورت یک پارچه طراحی نشود. یعنی بعد از اتمام پروژه، توسعه، تست پذیری و نگهداری آن سخت و در بعضی مواقع غیر ممکن خواهد شد. برنامه نویسی ماژولار این امکان را فراهم میکنه که یک پروزه با مقیاس برزگ به چند پروژه کوچک تقسیم شده و همه مراحل طراحی و توسعه و تست برای هر کدام از این ماژولها به صورت جدا انجام شود.
Prism امکاناتی رو برای طراحی و توسعه این گونه پروژهها به صورت ماژولار فراهم کرده است:
- ابتدا باید نام و مکان هر ماژول رو به Prism معرفی کنیم که میتونیم اونها رو در کد یا Xaml یا Configuration File تعریف کنیم.
- با استفاده از Metadata باید وابستگیها و مقادیر اولیه برای هر ماژول مشخص شود.
- با کمک تزریق وابستگیها ارتباطات بین ماژولها میسر میشود.
- ماژول مورد نظر به دو صورت OnDemand و Available لود خواهد شد.
در شکل زیر مراحل بالا قابل مشاهده است:
Bootstrapper چیست؟
در هر پروژه ماژولار (مختص Prism نیست) برای اینکه ماژولهای مختلف یک پروژه، قابلیت استفاده به صورت یک پارچه رو در یک Application داشته باشند باید مفهومی به نام Bootstapper رو پیاده سازی کنیم که وظیفه اون شناسایی و پیکربندی و لود ماژول هاست. در Prism دو نوع Bootstrapper پیش فرض وجود دارد.
- MefBootstrapper : کلاس پایه Bootstrapper که مبنای آن MEF است. اگر قصد استفاده از MEF رو در پروژههای خود دارید(^) Bootstrapper شما باید از این کلاس ارث ببرد.
- UnityBootstrapper : کلاس پایه Bootstrapper که مبنای آن UnityContainer است. اگر قصد استفاده از UnityContainer یا Service Locator (^) رو در پروژههای خود دارید Bootstrapper شما باید از این کلاس ارث ببرد.
تصویری از ارتباط Bootstrapper با ماژولهای سیستم
مفهوم Shell
در پروژههای WPF، در فایل App.xaml توسط یک Uri نقطه شروع پروژه را تعیین میکنیم. در پروژههای Silverlight به وسیله خاصیت RootVisual نقطه شروع سیستم تعیین میشود. در Prism نقطه شروع پروژه توسط bootsrapper تعیین میشود. دلیل این امر این است که Shell در پروژههای مبتنی بر Prism متکی بر Region Manager است. از Region برای لود و نمایش ماژولها استفاده خواهیم کرد.
ادامه دارد...
در نسخه dotnet Core 2.1 گویا از سیستم جدیدی تحت عنوان Razor UI In Class استفاده شده که طبق این لینک جهت مدیریت و پیاده سازی Identity نیز بهره برده شده و تمام مواردی که مربوط به احراز هویت و سطح دسترسی و غیره بوده در این سیستم متمرکز شده .
سشن صفر
یکی از تفاوتهای مهم امنیتی ویندوزهای جدید (از سرویس پک 2 ویندوز 2003 به بعد)، اجرای سرویسهای ویندوز در جلسهای کاری (سشنی) جدا از جسله کاری برنامههای عادی است که توسط کاربران وارد شده به سیستم اجرا میشوند. در این ویندوزها، تنها سرویسها هستند که در سشن صفر اجرا میشوند و مابقی برنامههای سایر کاربران در سشنهای دیگر.
این برخلاف چیزی است که برای مثال در ویندوز XP وجود دارد؛ یعنی اجرای دوستانهی تمام برنامهها در یک سشن (چون کاربر وارد شده به سیستم نیز در سشن صفر قرار میگیرد).
در این حالت برنامههای عادی میتوانند سرویسهای ویندوز را به راحتی مورد حمله قرار دهند. اطلاعات بیشتر:
مهمترین معنای اجرای ایزوله سرویسها در سشن صفر، به خاطره سپرده شدن سرویسهایی است که امکان تعامل با کاربر را داشتند؛ برای مثال سرویسهایی که یک رابط کاربری را نمایش میدادند (به کمک همان تیک معروف Allow Service to Interact with Desktop در صفحه تنظیمات یک سرویس). زیرا اکنون اولین کاربر وارد شده به سیستم، در سشن یک قرار میگیرد (و نه همانند قبل در سشن صفر). به این صورت دیگر به رابط کاربری نمایش داده شده در سشن صفر دسترسی نداشته و چیزی را مشاهده نخواهد کرد.
البته شاید سؤال بپرسید که چه سرویسهایی نیاز به نمایش رابط کاربری دارند؟ چون عموما سرویسی که صحیح طراحی شده باشد نیاز به تعامل مستقیم با کاربر را از طریق رابط کاربری ندارد.
و پاسخ این است که خیلی از سرویسها! در بسیاری از برنامههای متداول، امکان اجرای به صورت سرویس ویندوز NT پیش بینی نشده است. اگر نیاز باشد تا این نوع برنامهها را به صورت سرویس، برای مثال در یک ویندوز سرور اجرا کرد (تا همیشه در حال اجرا باشند و همچنین با ری استارت شدن سیستم نیز مجددا بدون دخالت کاربر شروع به کار کنند)، در این حالت نیاز خواهد بود تا رابط کاربری آنها نیز نمایش داده شوند.
سؤال: در ویندوزهای جدید برای تعامل با سشن صفر چه باید کرد؟
در ویندوز 2003 (به همراه تمام به روز رسانیها) برای اتصال به سشن صفر میتوان دستور زیر را در خط فرمان صادر کرد:
به این ترتیب امکان اتصال به سشن کنسول یا همان سشن صفر میسر میشود.
این پارامتر در ویندوز سرور 2008 ندید گرفته خواهد شد زیرا در این ویندوز امکان نصب یک سرویس در سشنهایی بجز سشن صفر نیز پیش بینی شده است؛ هر چند پیش فرض نصب همان سشن صفر است. اما به جهت سازگاری با نگارشهای قبل اینبار بجای پارامتر console از پارامتر admin استفاده کنید.
با استفاده از برنامه نویسی چطور؟
روش کار در این مقاله توضیح داده شده است اما سطر اول آن به این نکته تاکید دارد که ... اینکار را نکنید! سرویسی که درست طراحی شده باشد نیازی به رابط کاربری تعاملی عموما جهت اعمال تنظیمات آن، ندارد.
نصب قالب پروژه از طریق نیوگت
dotnet new --install DNTFrameworkCoreTemplateAPI::*
dotnet new dntcore-api
بررسی قسمتهای مختلف قالب پروژه
2- پروژه Infrastructure دربرگیرنده DbContext، مهاجرتها و کلاسهای تنظیمات نگاشت موجودیتها به جداول بانک اطلاعاتی پروژه میباشد. به عنوان مثال، به صورت پیشفرض تنظیمات نگاشت موجودیتهای کاربر و گروهکاربری و موجودیتهای وابسته آنها در این قالب پیادهسازی شدهاند. همچنین دو مهاجرت CreateInitialSchema و CreateIdentitySchema ایجاده شدهاند.
3- پروژه Application دربرگیرنده مدلها/DTOها، اعتبارسنجهای مدلها، سرویسها و همچنین Eventهای سفارشی و Handlerهای رویدادهای متناظر با موجودیتهای سیستم، میباشد. همانطور که شکل زیر ملاحظه میکنید، برای موجودیتهای کاربر و گروهکاربری طراحی و پیادهسازی پیشفرضی از قسمتهای مذکور ارائه شده است.
5- از پروژه Common نیز میتوان به عنوان دربرگیرنده کلاسهای کمکی مورد استفاده در سایر قسمتها، بهره برد.
6- پروژه UnitTests دربرگیرده آزمونهای واحد پروژه میباشد. به عنوان مثال، به صورت پیشفرض آزمونهای واحد مرتبط با UserValidator و RoleValidator به صورت کامل در این قالب تدارک دیده شده است.
7- پروژه IntegrationTests دربرگیرنده آزمونهای جامعیت مرتبط با پروژه میباشد. به عنوان مثال، آزمونهای جامعیت متناظر با سرویسهای کاربر و گروهکاربری نیز در این قالب تدارک دیده شده است.
نکته: بدلیل اینکه مکانیزم اعتبارسنجی خودکار ورودیها به عنوان یک Aspect برروی این سرویسها اعمال شده است و بدین ترتیب در فرآیند تست سرویسها نیز دخالت دارند، به صورت ناخواسته به سمت آزمون جامعیت سوق پیدا کردهایم. با این حال اگر برای لایه بالاتر/خارجی پروژه خود یا همان API در قالب، قصد تهیه آزمون جامعیت داشته باشید، میتوانید این تنظیمات ValidationInterceptor را از فایل ApplicationRegistry در پروژه Application حذف کرده و آزمونهای سرویسها را در قالب آزمون واحد انجام دهید. با این حال باید توجه کنید که برای برخی از سناریوها که امکانات هیچ کدام از مهیاکنندههای InMemory و SQLite درون حافظه، جوابگوی نیاز شما نباشد، نیاز خواهید داشت تا از بانک اطلاعاتی واقعی از جمله LocalDb استفاده کنید؛ در این صورت آزمونهای شما نیز در ردیف آزمونهای جامعیت قرار خواهند داشت.
8- پروژه API دربرگیرنده کنترلرها، هابهای SignalR، زیرساخت Authentication مبتنیبر JWT و سایر تنظیمات آغازین پروژه، میباشد. CRUD API متناظر با موجودیتهای کاربر و گروهکاربری نیز در این قالب تدارک دیده شده است.
کدهای کامل این قسمت را میتوانید از اینجا دریافت کنید.