public class TokenFactoryService { private readonly JwtBearerOptions _jwtBearerOptions; public TokenFactoryService(IOptionsSnapshot<JwtBearerOptions> jwtBearerOptions) { if (jwtBearerOptions == null) { throw new ArgumentNullException(nameof(jwtBearerOptions)); } _jwtBearerOptions = jwtBearerOptions.Value ?? throw new ArgumentNullException(nameof(jwtBearerOptions)); } // From: https://github.com/dotnet/aspnetcore/blob/a450cb69b5e4549f5515cdb057a68771f56cefd7/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs public bool ValidateJwt(string token) { foreach (var validator in _jwtBearerOptions.SecurityTokenValidators) { try { if (validator.CanReadToken(token)) { validator.ValidateToken(token, _jwtBearerOptions.TokenValidationParameters, out _); } } catch { return false; } } return true; } }
پردازشهای Async در Entity framework 6
یک نکته: علت اینکه پروژههای ASP.NET Core به این صورت پویا عمل میکنند، وجود NET Core CLI. هست. این CLI هم شبیه به Angular-CLI یک ابزار خط فرمان است که کار ایجاد یک پروژهی جدید تا ساخت و توزیع برنامه را مدیریت میکند و در حقیقت VS فقط این فرامین خط فرمان را در پشت صحنه اجرا میکند. بنابراین بهتر است از ساختار پروژهای استفاده کنید که اساسا برای ابزارهای CLI طراحی شدهاست.
#Defensive Code in C - قسمت سوم
ساختار پروژه های Angular
$routeProvider.when('/about', {templateUrl:'views/about.html', resolve:{deps:function($q, $rootScope) { var deferred = $q.defer(); var dependencies = [ 'controllers/AboutViewController.js', 'directives/some-directive.js' ]; //*نکته اول $script(dependencies, function() { // *نکته دوم $rootScope.$apply(function() { deferred.resolve(); }); }); return deferred.promise; }}})
ASP.NET MVC #11
چند نکته کاربردی درباره Entity Framework
- توضیح دادم در انتهای همان آزمایش. برای تکرار مجدد: چون یکبار رفت و برگشت کمتری داره به دیتابیس. چون تغییر State یک شیء و ورود آن به سیستم ردیابی، خیلی سریعتر است از واکشی اطلاعات از بانک اطلاعاتی. اما در مورد لیستی از اشیاء، توسط context.Factors سیستم EF دسترسی به IDها پیدا میکنه (در هر دو حالت متصل و منقطع). اگر سیستم ردیابی خاموش شود، برای اتصال مجدد اینها زمان خواهد برد (چون IDهای دریافت شده از بانک اطلاعاتی ردیابی نمیشوند)، اما در حالت متصل، همان بار اولی که کوئری گرفته شده، همانجا اتصال هم برقرار شده و در حین به روز رسانی اطلاعات میداند چه تغییراتی رخ داده و چگونه سریعا باید محاسبات رو انجام بده. اما در حالت منقطع توسط متد DetectChanges تازه شروع به اتصال و محاسبه میکند.
معماری لایه بندی نرم افزار #3
ما لایه ای به نام "لایه مخزن" را میسازیم تا در نهایت کلیه متدهایی که برای حرف زدن با داده هامون را نیاز داریم داشته باشیم. حالا این اطلاعات ممکنه از پایگاه داده یا جاهای دیگه جمع آوری بشوند (و الزاما توسط EF قابل دسترسی و ارائه نباشند)
همچنین گاهی نیاز هست که بر مبنای چند متد که EF به ما میرسونه (مثلا چند SP) یک متد کلیتر را تعریف کنیم (چند فراخوانی را در یک متد مثلا متد X در لایه مخزن انجام دهیم) و در لایه بالاتر آن متد را صدا بزنیم (بجای نوشتن و تکرار پاپی همه کدهای نوشت شده در متد X)
علاوه بر این در لایه مخزن میشه چند ORM را هم کنار هم دید (نه فقط EF) که همونطور که آقای خوشبخت در کامنتها نوشتند گاهی نیاز میشه.
بنابراین:
من وجود لایه مخزن را ضروری میدونم.
(فراموش نکنیم که هدف از این آموزش تعریف یک الگوی معماری مناسب برای پروژههای بزرگ هست و الا بدون خیلی از اینها هم میشه برنامه ساخت. همونطور که اکثرا بدون این ساختارها و خیلی سادهتر میسازند)
معماری لایه بندی نرم افزار #3
- من در عمل تفاوتی بین لایه مخزن و سرویس شما مشاهده نمیکنم. یعنی لایه مخزن داره GetAll میکنه، بعد لایه سرویس هم داره همون رو به یک شکل دیگری بر میگردونه. این تکرار کد نیست؟ این دو یکی نیستند؟
عموما در منابع لایه مخزن رو به صورت روکشی برای دستورات مثلا EF یا LINQ to SQL معرفی میکنند. فرضشون هم این است که این روش ما رو از تماس مستقیم با ORM برحذر میداره (شاید فکر میکنند ایدز میگیرند اگر مستقیم کار کنند!). ولی عرض کردم این روکش در واقعیت فقط شاید با EF یا L2S قابل تعویض باشه نه با ORMهای دیگر با روشهای مختلف و بیشتر یک تصور واهی هست که جنبه عملی نداره. بیشتر تئوری هست بدون پایه تجربه دنیای واقعی. ضمن اینکه این روکش باعث میشه نتونید از خیلی از امکانات ORM مورد استفاده درست استفاده کنید. مثلا ترکیب کوئریها یا روشهای به تاخیر افتاده و امثال این.
- پس در عمل شما Request ViewModel و Response ViewModel تعریف کردید.