اشتراکها
اشتراکها
اهمیت Object.observe در JavaScript
کلیات پایهی MVVM در برنامههای مشتق شدهی از XAML یکی است:
نظرات مطالب
مروری سریع بر اصول مقدماتی MVVM
پیشنیاز MVVM مباحث Binding در Silverlight و WPF است. یک کتاب فارسی رو در این زمینه در اینجا میتونید دریافت کنید: (^)
مرتبط با سیلورلایت است اما ... مباحث کلی آن با WPF تفاوتی ندارد و اصول یکی است.
مرتبط با سیلورلایت است اما ... مباحث کلی آن با WPF تفاوتی ندارد و اصول یکی است.
نظرات مطالب
آشنایی با الگوی M-V-VM- قسمت اول
به دلیل قابلیتهای binding پیشرفتهی WPF و Silverlight، الگوی MVVM بیشتر با این دو فناوری سازگار است؛ هر چند محدودیتی هم برای استفاده از آن در سایر حالات نیست.
بازخوردهای دوره
تزریق وابستگیهای AutoMapper در لایه سرویس برنامه
- محل تعریف نگاشتها و کلاسهای پروفایل، مهم نیست. چون اساسا هرجایی که قرار گیرند، دو وابستگی بیشتر نخواهند داشت: کلاسهای مدل و کلاسهای ViewModel.
- محل فراخوانی اولیهی تعاریف نگاشتها جهت معرفی آنها به سیستم، مهم است.
+ اگر از کاربر اطلاعاتی را دریافت میکنید، در لایه UI هست که کار نگاشت اطلاعات دریافتی از کاربر و از ViewModelها به Modelهای اصلی برنامه انجام میشود (توسط متد Mapper.Map). اگر قرار است اطلاعاتی را بازگشت دهید، متدهای جدیدی مانند Project To بسیار بهینهتر هستند از روش قدیمی Mapper.Map و این متد را بهتر است در لایه سرویس استفاده کنید. متد Project To کارش بهینه سازی کوئری SQL ارسالی به سرور هست. اگر از روش Mapper.Map در لایه UI استفاده کنید، این قابلیت را از دست خواهید داد؛ چون Mapper.Map به معنای کار با اشیاء درون حافظه و LINQ to Objects است. کار متد ویژهی Project To افزونهای برای کار با Entity Framework و بهینه سازی آن است.
- محل فراخوانی اولیهی تعاریف نگاشتها جهت معرفی آنها به سیستم، مهم است.
+ اگر از کاربر اطلاعاتی را دریافت میکنید، در لایه UI هست که کار نگاشت اطلاعات دریافتی از کاربر و از ViewModelها به Modelهای اصلی برنامه انجام میشود (توسط متد Mapper.Map). اگر قرار است اطلاعاتی را بازگشت دهید، متدهای جدیدی مانند Project To بسیار بهینهتر هستند از روش قدیمی Mapper.Map و این متد را بهتر است در لایه سرویس استفاده کنید. متد Project To کارش بهینه سازی کوئری SQL ارسالی به سرور هست. اگر از روش Mapper.Map در لایه UI استفاده کنید، این قابلیت را از دست خواهید داد؛ چون Mapper.Map به معنای کار با اشیاء درون حافظه و LINQ to Objects است. کار متد ویژهی Project To افزونهای برای کار با Entity Framework و بهینه سازی آن است.
- هر دوره قسمت اختصاصی رو داره به نام «پرسش و پاسخ» برای طرح این نوع سؤالات خارج از موضوع مطلب جاری، اما مرتبط با عنوان دوره.
- در این مورد DbContext در همان پرسش و پاسخهای قسمت 12 سری EF بحث شده. اینجا
برای تکرار:
«... در یک برنامه مبتنی بر MVVM، مدیریت طول عمر یک context در طول عمر ViewModel برنامه است. در یک برنامه ویندوزی تا زمانیکه یک فرم باز است، اشیاء آن تخریب نخواهند شد. بنابراین مدیریت context در برنامههای ویندوزی «دستی» است. در زمان شروع فرم context شروع خواهد شد، زمان تخریب/بستن آن، با بستن یا dispose یک context، خودبخود اتصالات هم قطع خواهند شد.
بنابراین در برنامههای وب «context/session per http request» داریم؛ در برنامههای ویندوزی «context per operation or per form». یعنی میتونید بسته به معماری برنامه ویندوزی خود، context را در سطح یک فرم تعریف کنید و مدیریت؛ و یا در سطح یک عملیات کوتاه مانند یک کلیک ...»
- در این مورد DbContext در همان پرسش و پاسخهای قسمت 12 سری EF بحث شده. اینجا
برای تکرار:
«... در یک برنامه مبتنی بر MVVM، مدیریت طول عمر یک context در طول عمر ViewModel برنامه است. در یک برنامه ویندوزی تا زمانیکه یک فرم باز است، اشیاء آن تخریب نخواهند شد. بنابراین مدیریت context در برنامههای ویندوزی «دستی» است. در زمان شروع فرم context شروع خواهد شد، زمان تخریب/بستن آن، با بستن یا dispose یک context، خودبخود اتصالات هم قطع خواهند شد.
بنابراین در برنامههای وب «context/session per http request» داریم؛ در برنامههای ویندوزی «context per operation or per form». یعنی میتونید بسته به معماری برنامه ویندوزی خود، context را در سطح یک فرم تعریف کنید و مدیریت؛ و یا در سطح یک عملیات کوتاه مانند یک کلیک ...»
نظرات مطالب
خودکارسازی فرآیند نگاشت اشیاء در AutoMapper
ممنون از پاسختون؛
اتفاق عجیبی رخ میده که متوجه نمیشم ؛ کلاسهای ViewModel در پروژه سرویس تعریف شدن و از داخل سرویس خروجی را مپ میکنم و بازگشت میدم.
به این صورتی که فرمودید عمل کردم؛ حالا عمل نگاشت و مپ در سرویس به درستی عمل میکنه ولی عمل نگاشت و مپ داخل کنترلها که داخل پروژه وب هستند دیگر کار نمیکند قبل از اینکه این کارو بکنم دقیقا عکس این اتفاق رخ میداد یعنی عمل مپ در پروژه وب و کنترلها به درستی انجام میشد ولی در داخل سرویس با خطا مواجه میشد. به نظر میرسه فقط عملیات مپ اسمبلی که معرفی شده به درستی کار میکند!
تنظیمات تزریق وابستگی اتومپر داخل پروژه MVC انجام میشه و در پروژه سرویس و کنترل های MVC مپر تزریق میشه. با سپاس.
مطالب دورهها
معرفی پروژه NotifyPropertyWeaver
پس از معرفی مباحث IL Code Weaving و همچنین ارائه راه حلی در مورد «استفاده از AOP Interceptors برای حذف کدهای تکراری INotifyPropertyChanged در WPF» راه حل مشابهی به نام NotifyPropertyWeaver ارائه شده است که همان کار AOP Interceptors را انجام میدهد؛ اما بدون نیاز به تشکیل پروکسی و سربار اضافی. کار نهایی را توسط ویرایش اسمبلی و افزودن کدهای IL لازم انجام میدهد؛ البته بدون استفاده از PostSharp. این پروژه از کتابخانه سورس باز پایهای به نام Fody استفاده میکند که جهت IL Code weaving طراحی شده است.
اگر به Wiki آن مراجعه نمائید، لیست افزونههای قابل توجهی را در مورد آن خواهید یافت که PropertyChanged تنها یکی از آنها است.
پیشنیازها
الف) صفحه پروژه در GitHub
ب) دریافت از طریق نوگت
روش استفاده
پس از نصب بسته نوگت پروژه PropertyChanged.Fody
کلاسی را که باید پس از کامپایل، پیاده سازیهای خودکار OnPropertyChanged را شامل شود، با ویژگی ImplementPropertyChanged مزین کنید.
و سپس پروژه را کامپایل نمائید. خروجی کنسول Build در VS.NET :
اکنون اگر فایل اسمبلی نهایی پروژه را در برنامه ILSpy باز کنیم، چنین پیاده سازی را میتوان شاهد بود:
اگر به Wiki آن مراجعه نمائید، لیست افزونههای قابل توجهی را در مورد آن خواهید یافت که PropertyChanged تنها یکی از آنها است.
پیشنیازها
الف) صفحه پروژه در GitHub
ب) دریافت از طریق نوگت
روش استفاده
پس از نصب بسته نوگت پروژه PropertyChanged.Fody
PM> Install-Package PropertyChanged.Fody
using PropertyChanged; namespace AOP02 { [ImplementPropertyChanged] public class Person { public string Id { set; get; } public string Name { set; get; } } }
------ Build started: Project: AOP02, Configuration: Debug x86 ------ Fody (version 1.13.6.1) Executing Finished Fody 287ms. AOP02 -> D:\Prog\AOP02\bin\Debug\AOP02.exe ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
using System; using System.ComponentModel; using System.Runtime.CompilerServices; namespace AOP02 { public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public string Id { [System.Runtime.CompilerServices.CompilerGenerated] get { return this.<Id>k__BackingField; } [System.Runtime.CompilerServices.CompilerGenerated] set { if (string.Equals(this.<Id>k__BackingField, value, System.StringComparison.Ordinal)) { return; } this.<Id>k__BackingField = value; this.OnPropertyChanged("Id"); } } public string Name { [System.Runtime.CompilerServices.CompilerGenerated] get { return this.<Name>k__BackingField; } [System.Runtime.CompilerServices.CompilerGenerated] set { if (string.Equals(this.<Name>k__BackingField, value, System.StringComparison.Ordinal)) { return; } this.<Name>k__BackingField = value; this.OnPropertyChanged("Name"); } } public virtual void OnPropertyChanged(string propertyName) { PropertyChangedEventHandler propertyChanged = this.PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }