شروع به کار با DNTFrameworkCore - قسمت 1 - معرفی و نحوه استفاده از آن
نویسنده: سالار ربال
تاریخ: ۱۳۹۷/۱۱/۲۸ ۲۲:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
پروژه DNTFrameworkCore که قصد پشتیبانی از آن را دارم، یک زیرساخت سبک وزن و توسعه پذیر با پشتیبانی از طراحی چند مستاجری، با تمرکز بر کاهش زمان و افزایش کیفیت توسعه سیستمهای تحت وب مبتنی بر ASP.NET Core، توسعه داده شده است.
اهدافی که این زیرساخت دنبال میکند
امکانات این زیرساخت در زمان نگارش مطلب جاری
نحوه استفاده از بستههای نیوگت مرتبط
PM> Install-Package DNTFrameworkCore -Version 1.0.0
services.AddDNTFramework()
.AddDataAnnotationValidation()
.AddModelValidation()
.AddValidationOptions(options =>
{
/*options.IgnoredTypes.Add(typeof());*/
})
.AddMemoryCache()
.AddAuditingOptions(options =>
{
// options.Enabled = true;
// options.EnabledForAnonymousUsers = false;
// options.IgnoredTypes.Add(typeof());
// options.Selectors.Add(new NamedTypeSelector("SelectorName", type => type == typeof()));
}).AddTransactionOptions(options =>
{
// options.Timeout=TimeSpan.FromMinutes(3);
//options.IsolationLevel=IsolationLevel.ReadCommitted;
}); متدهای الحاقی بالا برای ثبت سرویسها و تنظیمات مرتبط با مکانیزمهای اعتبارسنجی خودکار، مدیریت تراکنشها، لاگ آماری، Eventing و سایر امکانات ذکر شده، در IoC Container توکار ASP.NET Core استفاده خواهند شد.
PM> Install-Package DNTFrameworkCore.EntityFramework -Version 1.0.0
services.AddDNTUnitOfWork<ProjectDbContext>();
بسته نیوگت بالا شامل پیاده سازی مبتنی بر EF Core برای واسطهای تعریف شده در بسته نیوگت DNTFrameworkCore، میباشد؛ از جمله آن میتوان به CrudService پایه اشاره کرد. متد الحاقی AddDNTUnitOfWork برای ثبت و معرفی واسطهای IUnitOfWork و ITransactionProvider به عنوان مهیا کننده تراکنش به همراه پیاده سازهای آنها و همچنین ثبت یک سری Hook تعریف شده برای ردیابی تغییرات، در سیستم تزریق وابستگی، استفاده خواهد شد.
همچنین با نصب بسته بالا، امکان استفاده از مهیا کننده Logging با امکان ذخیره سازی در بانک اطلاعاتی را خواهید داشت:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEntityFramework<ProjectDbContext>(options => options.MinLevel = LogLevel.Warning);
})
.UseStartup<Startup>(); متد جنریک الحاقی AddEntityFramework برای ثبت مهیا کننده مذکور استفاده میشود.
PM> Install-Package DNTFrameworkCore.Web -Version 1.0.0
بسته نیوگت بالا شامل یکسری سرویس برای اعمال دسترسیهای پویا، CrudController مبتنی بر ASP.NET Core Web API، فیلتر مدیریت سراسری خطاهای برنامه و سایر امکاناتی که در ادامه مقالات با جزئیات بیشتری بررسی خواهیم کرد، میباشد. برای ثبت سرویسهای تعریف شده میتوانید از متد الحاقی AddDNTCommonWeb و به منظور تغییر محل ذخیره سازی کلیدهای موقت رمزنگاری مرتبط با Data Protection API و انتقال آنها به بانک اطلاعاتی، استفاده کنید.
services.AddDNTCommonWeb()
.AddDNTDataProtection();
نکته: برای انتقال کلیدهای موقت رمزنگاری به بانک اطلاعاتی، نیاز است تا از متد الحاقی زیر که در بسته نیوگت DNTFrameworkCore.EntityFramework موجود میباشد، به شکل زیر استفاده کنید:
services.AddDNTProtectionRepository<ProjectDbContext>();
PM> Install-Package DNTFrameworkCore.EntityFramework.SqlServer -Version 1.0.0
بسته بالا از امکانات مخصوص SqlServer برای اعمال قفل منطقی برای مدیریت مباحث همزمانی استفاده میکند؛ همچنین PreUpdateHook مرتبط با تولید خودکار کد منحصر به فرد، در این کتابخانه پیاده سازی شده است. به شکل زیر میتوانید سرویسهای مرتبط با آن را به سیستم تزریق وابستگیهای معرفی کنید:
services.AddDNTNumbering(options =>
{
options.NumberedEntityMap[typeof(Task)] = new NumberedEntityOption
{
Start = 100,
Prefix = "Task-",
IncrementBy = 5
};
}); به عنوان مثال برای شماره گذاری موجودیت Task، لازم است تنظیمات مرتبط آن را به شکل بالا به سیستم شماره گذاری معرفی کنید.
اگر قصد استفاده از کتابخانه FluentValidation را داشته باشید، میبایست بسته زیر را نیز نصب کنید:
PM> Install-Package DNTFrameworkCore.FluentValidation -Version 1.0.0
برای ثبت و معرفی Adapter مرتبط، به سیستم اعتبارسنجی خودکار معرفی شده، لازم است از طریق متد الحاقی AddFluentModelValidation به شکل زیر اقدام کنید:
services.AddDNTFramework()
.AddDataAnnotationValidation()
.AddModelValidation()
.AddFluentModelValidation()
.AddValidationOptions(options =>
{
/*options.IgnoredTypes.Add(typeof());*/
})
.AddMemoryCache()
.AddAuditingOptions(options =>
{
// options.Enabled = true;
// options.EnabledForAnonymousUsers = false;
// options.IgnoredTypes.Add(typeof());
// options.Selectors.Add(new NamedTypeSelector("SelectorName", type => type == typeof()));
}).AddTransactionOptions(options =>
{
// options.Timeout=TimeSpan.FromMinutes(3);
//options.IsolationLevel=IsolationLevel.ReadCommitted;
});
برای شروع پروژه جدید، نصب این بستهها کفایت میکند. اگر نیاز به طراحی MultiTenancy دارید، بسته زیر را برای شناسایی Tenant جاری و از این قبیل کارها نیز میبایست نصب کنید:
PM> Install-Package DNTFrameworkCore.Web.MultiTenancy -Version 1.0.0
services.AddMultiTenancy<TenantResolver>();
app.UseMultiTenancy();
services.Scan(scan => scan
.FromCallingAssembly()
.AddClasses(classes => classes.AssignableTo<ISingletonDependency>())
.AsMatchingInterface()
.WithSingletonLifetime()
.AddClasses(classes => classes.AssignableTo<IScopedDependency>())
.AsMatchingInterface()
.WithScopedLifetime()
.AddClasses(classes => classes.AssignableTo<ITransientDependency>())
.AsMatchingInterface()
.WithTransientLifetime()
.AddClasses(classes => classes.AssignableTo(typeof(IDomainEventHandler<>)))
.AsImplementedInterfaces()
.WithTransientLifetime());
foreach (var descriptor in services.Where(s => typeof(IApplicationService).IsAssignableFrom(s.ServiceType))
.ToList())
{
services.Decorate(descriptor.ServiceType, (target, serviceProvider) =>
ProxyGenerator.CreateInterfaceProxyWithTargetInterface(
descriptor.ServiceType,
target, serviceProvider.GetRequiredService<ValidationInterceptor>(),
(IInterceptor) serviceProvider.GetRequiredService<TransactionInterceptor>()));
}