⭐️ Course Contents ⭐️
⌨️ (0:00:00) Introduction
⌨️ (0:00:34) Blazor Architecture Overview
⌨️ (0:11:59) Blazor Architecture In Depth
⌨️ (0:24:00) Blazor Hosting Models
⌨️ (0:32:23) Project Structure
⌨️ (0:48:31) Data Binding
⌨️ (1:12:21) Components Basics
⌨️ (1:33:33) Communication Between Components Overview
⌨️ (1:37:59) Component Parameters
⌨️ (1:45:03) Route Parameters
⌨️ (1:57:05) Cascading Parameters
⌨️ (2:14:58) EventCallBack
⌨️ (2:27:16) Referencing Child Components
⌨️ (2:40:06) Templated Components - RenderFragment
⌨️ (2:51:31) Templated Components - Generic Typed Item List
⌨️ (3:07:01) Templated Components - Generic Typed RenderFragment
⌨️ (3:27:27) Templated Components - Generic Typed RenderFragment as a Form
⌨️ (3:37:30) When is Rendering Triggered
⌨️ (3:59:45) Lifecycle Events Sequence
⌨️ (4:11:39) Avoiding Data Initialization Pitfall
⌨️ (4:16:15) Forms and Validations
⌨️ (4:22:00) Dependency Injection
⌨️ (4:49:34) State Management with Flux in C#
⌨️ (5:34:37) Authentication
⌨️ (6:04:18) Creating a reusable DataGrid Component - Columns Configuration
⌨️ (6:36:27) Creating a reusable DataGrid Component - Paging
⌨️ (7:16:49) Creating a reusable DataGrid Component - Sorting
⌨️ (7:42:51) Thank you and My Contact Info
لیستی از NET Core Tools.
public class ProductService { public IEnumerable<Product> GetOrderedProducts() { using (var ctx = new Entites()) { return ctx.Products.OrderBy(x => x.Name).ToList(); } } }
public interface IUnitOfWork { IDbSet<TEntity> Set<TEntity>() where TEntity : class; int SaveAllChanges(); } public class Entites : DbContext, IUnitOfWork { public virtual DbSet<Product> Products { get; set; } // This is virtual because Moq needs to override the behaviour public new virtual IDbSet<TEntity> Set<TEntity>() where TEntity : class // This is virtual because Moq needs to override the behaviour { return base.Set<TEntity>(); } public int SaveAllChanges() { return base.SaveChanges(); } }
public class ProductService { private readonly IDbSet<Product> _products; private readonly IUnitOfWork _uow; public ProductService(IUnitOfWork uow) { _uow = uow; _products = _uow.Set<Product>(); } public IEnumerable<Product> GetOrderedProducts() { return _products.OrderBy(x => x.Name).ToList(); } }
[TestFixture] public class ProductServiceTest { private readonly ProductService _productService; public ProductServiceTest() { IQueryable<Product> data = GetRoadNetworks().AsQueryable(); var mockSet = new Mock<DbSet<Product>>(); mockSet.As<IQueryable<Product>>().Setup(m => m.Provider).Returns(data.Provider); mockSet.As<IQueryable<Product>>().Setup(m => m.Expression).Returns(data.Expression); mockSet.As<IQueryable<Product>>().Setup(m => m.ElementType).Returns(data.ElementType); mockSet.As<IQueryable<Product>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator()); var context = new Mock<Entites>(); context.Setup(c => c.Products).Returns(mockSet.Object); context.Setup(m => m.Set<Product>()).Returns(mockSet.Object); _productService = new ProductService(context.Object); } private IEnumerable<Product> GetRoadNetworks() { return new List<Product> { new Product { Id = 1, Name = "A" }, new Product { Id = 2, Name = "B" }, new Product { Id = 3, Name = "C" } }; } [Test] public void GetOrderedProductTest() { IEnumerable<Product> products = _productService.GetOrderedProducts(); List<string> names = products.Select(x => x.Name).ToList(); var expected = new List<string> {"A", "B", "C"}; CollectionAssert.AreEqual(names, expected); } }
پیش نیاز ها:
»Owin چیست
»تبدیل برنامههای کنسول ویندوز به سرویس ویندوز ان تی
برای شروع یک برنامه Console Application ایجاد کرده و اقدام به نصب پکیجهای زیر نمایید:
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost Install-Package TopShelf
حال یک کلاس Startup برای پیاده سازی Configurationهای مورد نیاز ایجاد میکنیم
در این قسمت میتوانید تنظیمات زیر را پیاده سازی نمایید:
»سیستم Routing؛
»تنظیم Dependency Resolver برای تزریق وابستگی کنترلرهای Web Api؛
»تنظیمات hubهای SignalR(در حال حاضر SignalR به صورت پیش فرض نیاز به Owin برای اجرا دارد)؛
»رجیستر کردن Owin Middlewareهای نوشته شده؛
»تغییر در Asp.Net PipeLine؛
»و...
public class Startup { public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseWebApi(config); } }
در این مرحله یک کنترلر Api به صورت زیر به پروژه اضافه نمایید:
public class ValuesController : ApiController { public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; } public string Get(int id) { return "value"; } public void Post([FromBody]string value) { } public void Put(int id, [FromBody]string value) { } }
public class ServiceHost { private IDisposable webApp; public static string BaseAddress { get { return "http://localhost:8000/"; } } public void Start() { webApp = WebApp.Start<Startup>(BaseAddress); } public void Stop() { webApp.Dispose(); } }
در مرحله آخر باید شروع و توقف سرویسها را تحت کنترل کلاس HostFactory کتابخانه TopShelf در آوریم. برای این کار کافیست کلاسی به نام ServiceHostFactory ایجاد کرده و کدهای زیر را در آن کپی نمایید:
public class ServiceHostFactory { public static void Run() { HostFactory.Run( config => { config.SetServiceName( "ApiServices" ); config.SetDisplayName( "Api Services ]" ); config.SetDescription( "No Description" ); config.RunAsLocalService(); config.Service<ServiceHost>( cfg => { cfg.ConstructUsing( builder => new ServiceHost() ); cfg.WhenStarted( service => service.Start() ); cfg.WhenStopped( service => service.Stop()); } ); } ); } }
با استفاده از متد ConstructUsing عملیات وهله سازی از سرویس انجام خواهد گرفت. در پایان نیز متد Start و Stop کلاس ServiceHost، به عنوان عملیات شروع و پایان سرویس ویندوز مورد نظر تعیین شد.
حال اگر در فایل Program پروژه، دستور زیر را فراخوانی کرده و برنامه را ایجاد کنید خروجی زیر قابل مشاهده است.
ServiceHostFactory.Run();
در حالیکه سرویس مورد نظر در حال اجراست، Browser را گشوده و آدرس http://localhost:8000/api/values/get را در AddressBar وارد کنید. خروجی زیر را مشاهده خواهید کرد:
تزریق وابستگیها
سلام و درود بر شما آقای نصیری
من چون توی دات نت تازه کار هستم دوتا سئوال خدمتتون دارم:
من توی برنامه ای که دارم مینویسم از الگوی UnitOfWork مطابق با آموزشهای شما استفاده کردم درضمن برای تزریق وابستگی هم از StructerMap استفاده میکنم، برنامه Win Form هستش وتوی Main یک کلاس Configuration رو که کارش Registerکردن کلیهInterface وکلاس هاست رو فراخونی کردم.
اول اینکه : برای آزاد سازی منابع و استفاده بهینه از حافظه در حال استفاده از StructerMap شما چه پیشنهاد یا روشی رو معرفی میکنین؟
دوم اینکه : با ازدیاد و تعدد کلاسها واینترفیسها در حالیکه در ابتدای برنامه کلیه اونها رو با StructerMap رجیستر میکنیم ودر هرجا که لازم باشه فقط از اونها یک نمونه میسازیم، اشکالی در روند عملیاتی وکاربری با اون نرم افزار پیش مشتری پیش نمییاد؟ (مخصوصا در سیستمهای یکپارچه و بزرگ از نظر حافظه).
سوم اینکه: آیا بایدها ونبایدهایی هم در استفاده از StructerMap وجود داره ؟
سپاسگزار شما هستم.
#define DEBUG ... #if DEBUG Console.WriteLine("You have defined DEBUG symbol"); #endif
#if STANDARD Console.WriteLine("You have defined STANDARD symbol"); #elif PROFESSIONAL Console.WriteLine("You have defined PROFESSIONAL symbol"); #elif ULTIMATE Console.WriteLine("You have defined ULTIMATE symbol"); #endif
#if STANDARD && EVAL Console.WriteLine("You have defined STANDARD and EVAL symbols"); #endif
پیش پردازندههای #warning و #error
#if STANDARD && EVAL Console.WriteLine("You have defined STANDARD and EVAL symbols"); #endif
#region و #endregion
#line
namespace CSPreProcessorDirectivesDemo { class Program { static void Main(string[] args) { inta a = 100; Console.ReadLine(); } } }
#line 400 "MyFile.cs" inta a = 100;
#pragma pragma-name pragma-arguments
#pragma warning disable #pragma warning restore
#pragma warning disable 414 #pragma warning disable 414, 3021
#checksum
#pragma checksum "filename" "{guid}" "checksum bytes"
// Guid for the interface IMyInterface. [Guid("F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4")] interface IMyInterface { void MyMethod(); } // Guid for the coclass MyTestClass. [Guid("936DA01F-9ABD-4d9d-80C7-02AF85C822A8")] public class MyTestClass : IMyInterface { public void MyMethod() {} }
class TestClass { static int Main() { #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "{012345678AB}" // New checksum } }
منابع :
کاری که پیشتر میخواستند انجام دهند، محدود کردن ASP.NET Core به سطح API موجود در NET Core. بود (NET Core 2.0 only. یا تصویر زیر) و نه صرفا به NET Standard. . این مساله برای توسعه دهندگان ASP.NET Core میتوانست فوق العاده باشد؛ چون سطح API بیشتر و بهروزتری را در اختیارشان قرار میداد و اگر قابلیتی در NET Standard. وجود نداشت، نمیبایستی درخواست میدادند تا اضافه شود تا بعد بتوانند استفاده کنند.
اما چون این مساله و سطح API بیشتر و گاهی از اوقات کاملا متفاوت، سازگاری با کتابخانههایی را که در میدان دید این API قرار نمیگرفتند، زیر سؤال میبرد، ارتقاء برنامههای قبلی را با مشکل مواجه میکرد. به همین جهت تصمیم گرفتهاند که ASP.NET Core را سازگار با دات نت فریم ورک کامل نیز ارائه دهند و بنابراین «محدودش کنند» به NET Standard 2.0. و نه حالت NET Core only. قبلی: اطلاعات بیشتر
به علاوه باید درنظر داشت که امکان اضافه کردن یک بستهی نیوگت از یک کتابخانهی نوشته شدهی برای دات نت کامل در برنامههای دات نت Core به معنای تضمینی برای کار کردن آن در زمان اجرا نخواهد بود. از این جهت که دات نت کامل، به همراه قسمتهایی است که در NET Standard. وجود خارجی ندارند. بنابراین اگر کتابخانهی استفاده شده صرفا این API مشترک را هدف قرار دادهاست، هم قابلیت اتصال و هم قابلیت اجرا را خواهد داشت؛ اما اگر برای مثال کسی بستهی NServiceBus را به پروژهی ASP.NET Core 2.0 اضافه کند، بدون مشکل کامپایل خواهد شد. اما از آنجائیکه این کتابخانه از MSMQ استفاده میکند که خارج از میدان دید این استاندارد است، در زمان اجرا با شکست مواجه خواهد شد.
مطلبی رو در سایت آقای اسکات هنسلمن دیدم که به نظرم برای برگرداندن به فارسی جالب اومد. شاید باعث شود که اندکی به فکر فرو رویم که ... چکار داریم میکنیم و قرار است به کجا برویم/برسیم.
- - آیا هنوز کد مینویسید؟ آیا به آن علاقمندید؟!
- - آیا میدانید SOLID چیست؟
- - آیا میدانید SRP مخفف چیست و چه اهمیتی دارد؟
- - پروژهای مبتنی بر یک فناوری جدید به شما انتساب داده شده است. چگونه آنرا آغاز خواهید کرد؟
- - در مورد IOC یا Inversion of control چه میدانید؟ ارتباط آن با dependency injection چیست؟
- - برنامه 2 tier با برنامهی 3 tier چه تفاوتی دارد؟
- - فلسفهی وجودی Interface چیست و چه اهمیتی دارد؟
- - الگوی Repository را شرح دهید. الگوی Factory چیست؟ چرا الگوهای طراحی برنامه نویسی شیءگرا مهم هستند؟
- - Anti-patterns کدامند؟ توضیح دهید.
- - آیا تابحال اسم Gang of Four به گوشتان خورده است؟ در چه موردی است؟
- - ارتباط الگوهای MVP ، MVC و MVVM در چیست؟ هر کدام از این الگوها در چه زمانیهایی بهتر است بکار گرفته شوند؟
- - مفهوم جداسازی وابستگیها (Separation of Concerns) چیست. مزایا و معایب آن کدامند؟
- - سه ویژگی اصلی طراحی شیءگرا را نام برده و توضیح دهید.
- - یک الگوی طراحی را توضیح دهید که در خانوادهی الگوی Factory قرار نمیگیرد. این الگو چه زمانی بهتر است بکار برده شود و چگونه؟
- - فرض کنید یک پروژهی قدیمی را که از مشکلات حاد نگهداری رنج میبرد، به شما انتساب دادهاند. چه فاکتورها و اقداماتی را جهت بهبود این وضعیت درنظر گرفته و چگونه برنامه را به سمت یک پروژهی پایدار پیش خواهید برد؟
- - مفهوم Service Orientation چه اثری را بر طراحی سیستمها خواهد گذاشت؟ کجاها بهتر است استفاده شود؟
- - در مورد portfolio تمام برنامههایی که تاکنون بر روی آنها کار کردهاید توضیح دهید. شما چه نقشی در طراحی آن داشتهاید؟
- - منهای بانکهای اطلاعاتی رابطهای، با چه روشهایی جهت ذخیره سازی اطلاعات آشنایی دارید؟ مزایا و معایب آنها چیست؟
- - در مورد مفهوم convention over configuration توضیح دهید. آخرین مثال عملی که در این مورد دیدهاید چه بوده است؟
- - در مورد سیستمهای بدون حالت و با حالت (stateless and stateful) توضیح دهید. اثر هر کدام بر parallelism چیست؟
- - تفاوتهای بین Stubs و Mocks چیست و از هر کدام در کجاها استفاده خواهید کرد؟
- - مفهوم YAGNI را به همراه یک مثال عملی توضیح دهید.
- - sandbox چه معنایی دارد؟ آیا میتوانید مثالهایی عملی از این مفهوم را در سیستمهای موجود نام ببرید؟
- - حالتهای با و بدون قفل در مدلهای Concurrency چه تفاوتی دارند؟
- - زمانیکه از مدلهای با قفل و یا بدون قفل استفاده میکنید ممکن است به چه مشکلاتی برخورد کنید؟
- - مفهوم resource contention را توضیح دهید.
- - مدل بر مبتنی بر وظیفه با مدل مبتنی بر ریسمان چه تفاوتهایی دارند؟ ( task-based model & threaded model )
- - تفاوتهای بین asynchrony و concurrency را توضیح دهید.