۱۳۹۱ بهمن ۵, پنجشنبه

آشنایی با Prism - شروع به کار

Prism یک فریم ورک برای طراحی نرم افزارهای قوی، قابل انعطاف با نگه داری آسان در WPF، Silverlight و Windows Phone است.
به کمک Prism شما می توانید برنامه هایی با اجزای وابسته ضعیف طراحی کنید که می توانند مستقل باشند ولی به آسانی به برنامه اصلی مجتمع شوند. این گونه برنامه ها عموما برنامه های ترکیبی (Composite Application) گفته می شود.

برای شروع می توانید Prism را به همراه سورس آن دانلود کرده و بر روی سیستم خود extract کنید. کتابخانه Prism برای برنامه های Desktop (و WPF) در مسیر bin\Desktop قرار دارد. 
Prism جهت تزریق وابستگی ها، بطور پیشفرض با Unity کار می کند. ولی در صورتی که با فریم ورک های دیگر تزریق وابستگی کار می کنید، دست شما باز است. مثلا برای Ninject یک extension ویژه استفاده در Prism تهیه شده است. همینطور Structure Map هم دارای کلاس های ویژه Prism است.

در صورتی که با مفاهیم تزریق وابستگی آشنایی ندارید، می توانید از اینجا شروع کنید.

ابزار کار لازم
  • Visual Studio نسخه 2010 یا 2012 (البته نسخه های قدیمی تر هم قابل استفاده هستند ولی نسخه Prism 4.1 فقط با دات نت 4 کار می کند. در صورتی که از Visual Studio 2008 استفاده می کنید باید نسخه Prism 2.1 را نصب کنید.)
  • اگر تمایلی به دستکاری source code کتابخانه Prism ندارید می توانید براحتی آن را توسط Nuget نصب کنید. پس درصورتی که آن را ندارید، دانلود کرده و نصب کنید.


آماده سازی محیط کار
ویژوال استودیو را اجرا کنید و یک پروژه جدید از نوع WPF Application ایجاد کنید. دقت کنید، دات نت 4 در لیست Target Framework انتخاب شده باشد. حالا در پنجره Package Manager Console دستور زیر را وارد کنید:

Install-Package Prism

و در ادامه برای نصب Unity، دستور زیر را وارد کنید:

Install-Package Unity

حالا نوبت نصب Unity Extension برای Prism است:

Install-Package Prism.UnityExtensions

برنامه های WPF از فایلی به نام App.xaml شروع می شوند. بطور پیش فرض، در این فایل، مسیر پنجره اصلی برنامه در یک مشخصه به نام StartupUri تعیین شده است ولی برنامه های مبتنی بر Prism، راه حلی متفاوت برای شروع دارند.

کلاس Bootstrapper
Bootstrapper نام کلاسی است که تمامی پیکربندی اولیه شروع برنامه در آن مشخص می شود. در Solution Explorer بر روی پروژه راست کلیک کرده و کلاس جدید به آن اضافه کنید. آن را Bootstrapper بنامید و کد زیر را در آن بنویسید.

    public class Bootstrapper : UnityBootstrapper
    {
        protected override System.Windows.DependencyObject CreateShell()
        {
            var mainView = new MainWindow();
            mainView.Show();
            return mainView;
        }
    }

کلاس Bootstrapper ما از کلاس UnityBootstrapper ارث برده است. تنها تابع که پیاده سازی آن اجباری است، تابع CreateShell است. این تابع، مقداری از نوع DependencyObject برمیگرداند که نقطه شروع نمایش برنامه را مشخص می کند. از آنجایی که برنامه ما یک WPF Application است، و در آن، MainWindow.xaml قرار است فرم اصلی باشد، ما یک نمونه از ان را ایجاد کرده، نمایش داده و برمی گردانیم. البته این روش new کردن به صورت دستی چندان مناسب نیست، بهتر است به کمک Unity این نمونه سازی را انجام دهیم:

    using Microsoft.Practices.Unity;
    using Microsoft.Practices.Prism.UnityExtensions;

    public class Bootstrapper : UnityBootstrapper
    {
        protected override void ConfigureContainer()
        {
            base.ConfigureContainer();

            Container.RegisterType<MainWindow>();
        }

        protected override System.Windows.DependencyObject CreateShell()
        {
            var mainView = Container.Resolve<MainWindow>();
            mainView.Show();
            return mainView;
        }
    }

اکنون یک تابع دیگر از UnityBootstrapper را override کرده ایم و در آن علاوه بر فراخوانی ConfigureContainer کلاس والد، پنجره اصلی (کلاس MainWindow) را در Unity Container ثبت کردیم. از تابع ConfigureContainer جهت رجیستر کردن سرویس ها، اینترفیس ها و کلاس های مورد نیاز در برنامه استفاده می شود. (using ها فراموش نشود!)
به App.xaml برمیگردیم. ابتدا مشخصه StartupUri و مقدار آن را پاک کرده و سپس به code behind آن رفته و تغییرات زیر را ایجاد کنید:

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            var bootstrapper = new Bootstrapper();
            bootstrapper.Run();

        }
    }
ما تابع OnStartup را override کردیم. این تابع با شروع برنامه، اجرا می شود. در آن یک نمونه از Bootstrapper ساختیم و تابع Run آن را اجرا کردیم.
اکنون پروژه را کامپایل نموده و اجرا کنید. در صورتی که تمام مراحل را بدون خطا سپری کرده باشید، پنجره برنامه را مشاهده خواهید کرد.

سورس کامل این قسمت را تحت عنوان Step 1 از اینجا دانلود کنید.