معرفی فریمورک AUA بخش سوم

در قسمت دوم به صورت جزئی تری فریمورک AUA را مورد برسی قرار دادیم و کد نویسی شدیم در این مقاله بخش های دیگیر AUA Framework را مورد بررسی قرار میدهیم. لطفا سوالات و نظرات خوتون رو در قسمت کامنت ها بنویسید.کلیه محتوای این مقاله متعلق به سایت auaframework میباشدفراخوانی SQL Stored Procedure در فریم ورک Asp.Net Unique Architectureدر بیشتر مواقع برنامه نویس برای راحتی کار با SQL Stored Procedure به سراغ راه های دیگری مثل Ado.net, Dapper می رود، غافل از این که تعداد کانکشن های ساخته شده را مدیریت کند یا یک کانتکست جدا برای آن بسازد و ... در فریم ورک AUA این کار(فراخوانی SQL Stored Procedure) به راحتی و سادگی قابل انجام بوده و هیچ یک از مشکلات بالا را نداردCREATE PROCEDURE [dbo].[uspGetUserRoles] @userId bigint AS SELECT ROLE.Id as RoleId,ROLE.Title,ROLE.Description FROM UserRole INNER JOIN ROLE ON UserRole.RoleId=ROLE.Id WHERE UserRole.AppUserId=@userIdبرای خروجی پروسیجر یک ویو مدل می سازیم.public class GetUserRolesSpResult { public int RoleId { get; set; } public string Title { get; set; } public stringDescription { get; set; } }publicIQueryable<GetUserRolesSpResult> GetUserRolesSp(long userId) { var cmd = LoadStoredProc(StoredProcedureConsts.GetUserRoles) .WithSqlParam(&quotuserId&quot, userId); return cmd .ExecuteStoredProc<GetUserRolesSpResult>(); }برای جلوگیری از پراکندگی نام پروسیجر ها آن ها را در یک کلاس به صورت ثابت قرار می دهیم.public class StoredProcedureConsts { public const string GetAppUsersCount = &quotuspGetAppUsersCount&quot public const string GetUserRoles = &quotuspGetUserRoles&quot }فریم ورک این قابلیت را میدهد که شما می توانید بر روی خروجی پروسیجر کوئری بزنید. اما این کار درست نیست و بهتر است برای هر کار پروسیجر خاص خود را بنویسید. سرویس StoredProcService که شامل تمام پروسیجر ها می باشد برای شما این امکان را فراهم می کند که بتوانید پروسیجر خود را فراخوانی نمایید.public class StoredProcService : FuncBaseService, IStoredProcService { public StoredProcService(IUnitOfWork unitOfWork) : base(unitOfWork) { } public IQueryable<GetUserRolesSpResult> GetUserRolesSp(long userId) { return UnitOfWork .StoredProc .GetUserRolesSp(userId); } }کار باSQL Function در فریم ورکAsp.Net Unique Architectureاز ویژگی های خوب در AUA کار با توابع در SQL Server می باشد که بتوان نتیجه آنها را در Object ها مپ کند و روی نتیجه آنها Linq کوئری بزنیم که در فریم ورک AUA این کار به راحتی قابل انجام است و از تولید کد کثیف برای این کار جلوگیری می کند.برای مثال: یک تابع که کد کاربر را گرفته و نام آن را برگشت میدهد را با فریم ورک AUA فراخوانی می کنیم.CREATE FUNCTION [dbo].[GetUserName] (@userId BIGINT) RETURNS NVARCHAR(20) AS BEGIN RETURN (SELECT UserName FROM AppUser WHERE Id=@userId) ENDدر SqlFunctionContext می توان فراخوانی تابع جدید را اضافه نمود.public class SqlFunctionContext { private readonly DbContext _dbContext; public SqlFunctionContext(DbContext dbContext) { _dbContext = dbContext; } public stringGetUserName(long userId) { var resultParameter = new SqlParameter(&quot@result&quot, SqlDbType.NVarChar, 200) { Direction = ParameterDirection.Output }; ExecuteSqlCommand($&quotSET @result= dbo.GetUserName('{userId}')&quot,resultParameter); return resultParameter.Value as string; } private voidExecuteSqlCommand(stringsqlCommand, IDbDataParameter resultParameter) { _dbContext? .Database? .ExecuteSqlCommand(sqlCommand, resultParameter); } }در سرویس SqlFunctionService می توان تابع مورد نظر دسترسی داشت و آن را فراخوانی نمود.public class SqlFunctionService : FuncBaseService, ISqlFunctionService { public SqlFunctionService(IUnitOfWork unitOfWork) : base(unitOfWork) { } public stringGetUserName(long userId) { return UnitOfWork .SqlFunction .GetUserName(userId); } }کار با SQL Viewها در فریم ورک (AUA) Asp.Net Unique Architectureیکی از دغدغه های برنامه نویس های دات نت، کار باSQL View ها می باشد که بتوانند نتیجه آنها را درObject ها مپ و روی خروجی ویو ها فیلتر اعمال کنند . Entity Framework ویو ها را به عنوان جدول می شناسد اما در فریم ورک AUA این امکان فراهم شده است که خروجی ویو را داخل ابجکت ها مپ کنیم و روی آن فیلتر اعمال کنیم.CREATE VIEW [dbo].[UserRolesVw] AS SELECT AppUser.Id AS userId,AppUser.UserName,Role.Title FROM AppUser INNER JOIN UserRole ON AppUser.Id=UserRole.AppUserId INNER JOIN Role ON UserRole.RoleId=Role.Id GOpublic class UserRolesVw : BaseView { public long UserId { get; set; } public string UserName { get; set; } public string Title { get; set; } }و یک View DTO برای خروجی ویو ساخته می شود.( در صورتی که بخوایم در خروجی ویو تغییر انجام دهیم آن را در DTO اعمال می کنیم).public class UserRolesVwDto : IMapFrom<UserRolesVw> { public long UserId { get; set; } public string UserName { get; set; } public string Title { get; set; } }و یک سرویس برای کار کردن با ویو ساخته می شود که فیلتر های احتمالی و ... برای ویو در آنجا نوشته شود.اینتر فیس:public interface IUserRolesVwService : IBaseGenericService<UserRolesVw, UserRolesVwDto> { }سرویس ویو:public class UserRolesVwService : BaseGenericService<UserRolesVw, UserRolesVwDto>, UserRolesVwService { public UserRolesVwService(IUnitOfWork unitOfWork) : base(unitOfWork) { } }ژ Message Provider در فریم ورک Asp.Net Unique Architectureدر فریم ورک AUA دو نوع مسیج باکس به صوت Html Messagebox و Messagebox Dialog وجود دارد.در صورتی که در View.csHtml از HtmlMessages استفاده کنیم پیغام ها با رنگ متناسب به صورت Htmlنمایش داده می شوند و در صورتی که از DialogMessages استفاده شود پیغام ها به صورت دیالوگ نمایش داده می شوند و در صورتی که در ویو هر دو مدل لود شده باشند به صورت Html و دیالوگ نمایش داده می شوند.انواع Messagebox:NotifyMessageSuccessMessageErrorMessageWarningMessageMessageاضافه کردن MessageProvider به View.csHtml<div class=&quotform-group&quot> <partial name=&quotMessageProvider/HtmlMessages/_AllHtmlMessage&quot /> </div> @* OR *@ <div class=&quotform-group&quot> <partial name=&quotMessageProvider/DialogMessages/_AllDialogMessage&quot /> </div>در کنترلر به راحتی می توان پیغام را به سمت ویو ارسال و نمایش دهیم.public IActionResult Index() { NotifyMessage(&quot** NotifyMessage **&quot); SuccessMessage(&quot** SuccessMessage **&quot); ErrorMessage(&quot** ErrorMessage **&quot); WarningMessage(&quot** WarningMessage **&quot); Message(&quot** Message **&quot); return View(); }نمایش پیغام ها به صورت HtmlMessagesنمایش پیغام به صورت DialogMessagesنمایش پیغام ها به دو صورت HtmlMessages و DialogMessagesکنترل خطا Exception Handling در فریم ورکAsp.Net Unique Architectureیکی از مهمترین ماژول های فریم ورک(AUA) Asp.Net Unique Architecture ماژول کنترل خطای آن می باشد.این فریم ورک در بحث کنترل و مدیریت خطاها بسیار بی نقص عمل می کند. بعنوان مثال: با ورود کاربر به یکی از اکشن ها، یک اکسپشن رخ میدهد ولی صفحه خطا نمایش داده نمی شود و متن خطا را به صورت پیغام کنترل شده و زیبا نمایش میدهد و URL تعییر نمی کند.در هر جایی که بخواهیم پردازش درخواست را قطع کنیم می توان یک Exception را throw کنیم و پردازش قطع می شود و خطا به ماژول کنترل خطا ارسال می شود.برای مثال: اگر کاربر لاگین نکرده باشدپردازش درخواست باید قطع شود و خطا نمایش داده شود.publicIActionResult Index() { if (CurrentUser is null) throw new ClientException(&quotCustom Error Exception&quot); {ماژول مدیریت خطا و نمایش آن به صورت پیغامژschema بندی جداول در فریم ورک Asp.Net Unique Architectureیکی از نکات امنیتی در SQL Server مبحثschema بندی جداول می باشد. بصورت پیش فرض درSQL Server نام جداول با پیشوندdbo ذخیره می شود. این امکان در فریم ورک وجود دارد که این schema به دلخواه کاربر تغییر کند، که در فریم ورک Asp.Net Unique Architecture این کار به راحتی قابل انجام و مدیریت است.جهت مدیریت و جلوگیر از پرگندگی ثابت ها در برنامه، آنها را در کلاس ها به صورت ثابت می نویسیم.public class SchemaConsts { public const string Accounting = &quotAcc&quot public const string School = &quotSch&quot }[Table(&quotStudent&quot, Schema = SchemaConsts.School)] public class Student : DomainEntity { public stringFirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }نتایج اعمال schemaدر پایگاه دادهکار با فایل تنظیمات در فریم ورک (AUA) Asp.Net Unique Architectureیکی از کد های کثیفی که در بیشتر پروژه ها دیده می شود، نحوه خواندن مقادیر از فایل هایی همچون AppSetting.json, WebConfig و فایل های تنظیمات در ASp.net Core می باشد که در بیشتر موارد باعث تولید خطا می شود. در فریم ورک AUA با الگو های طراحی مناسب به خواندن این فایل ها در Json , Xml پرداخته ایم.دو نوع فایل تنظیمات با فرمت های Json و Xmlدر نظر گرفته شده است .( Setting.xml , appsettings.json)کد زیر جهت خواندن مقدار کلید رمزنگاری از فایل appsettings.json استفاده می کند.public class AppSetting { public static string GetDataEncryptionKey => AppConfiguration .GetConfigurationRoot() .GetSection(AppSettingConsts.AppSetting) .GetSection(AppSettingConsts.DataEncryptionKey) .Value; }جهت خواندن مقدار کلید رمزنگاری از فایل کانفیگ.Var dataEncryptionKey= AppSetting.GetDataEncryptionKeyبرای کار کردن با فایل تنظیمات XML از الگوی Xml Pattern استفاده نموده ایم.Rest WebApiدر فریم ورک Asp.Net Unique ArchitectureAPI رابط پیاده سازی توسط نرم افزار است که به دیگر برنامه ها اجازه می دهد با آن ارتباط داشته باشند. API بستری است که به ما کمک می کند سرویس های مبتنی بر پروتکل HTTP را آسان تر از پیش پیاده سازی کنیم. سرویس گیرنده های زیادی مانند: مرورگر های وب، دستگاه های موبایل و نرم افزار های دسکتاپ قادر هستند که از امکانات این بستر (Web Api) استفاده نمایند.درلایه آخر فریم ورک AUA می توان از تکنلوژی های مختلف مثل MVC معمولی -Rest WebApi- Grpc- Graphql - استفاده نمود. تکنولوژی JWT (Json web Token)جهت سطوح دسترسی برای WebApi در فریم ورک AUA به صورت کامل پیاده سازی شده و می توانید استفاده نمود. و....از Swagger برای سهولت استفاده وتست WebApi استفاده شده است. تمام نیازمندی ها برای لاگین و سطوح دسترسی با استفاده از توکن برای فریم ورک AUA نسخه ی WebApi نوشته شده و آماده توسعه بیزینس شما می باشد.در نظر داشته باشید فریم ورک AUA را می توان برای Windows form application , WPF , … نیز استفاده نمود زیرا لایه آخر تغییر می کند. فریم ورک AUA فراتر از آن است که در این سند گنجانیده شود. این سند فقط جهت آشنایی و کار با فریم ورک AUA تنظیم و تهیه شده است. با استفاده از این داکیومنت و فیلم های آموزشی ، برنامه نویس در هر سطحی که باشد، بعد از یک هفته می تواند با فریم ورک به راحتی کار کند.AUA برای تمام مراحل دارای فیلم آموزشی می باشد و به راحتی می توان با آن کار نمود.جهت دانلود فیلم آموزشی کار با فریم ورک AUA و تهیه آن می توان به سایت هیلتن با آدرس www.heilton.com مراجعه نمود.