{"id":50,"date":"2012-05-07T19:24:00","date_gmt":"2012-05-07T19:24:00","guid":{"rendered":"http:\/\/tpodolak.com.hostingasp.pl\/blog\/2012\/05\/07\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/"},"modified":"2016-01-31T00:18:15","modified_gmt":"2016-01-31T00:18:15","slug":"tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro","status":"publish","type":"post","link":"https:\/\/tpodolak.com\/blog\/2012\/05\/07\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/","title":{"rendered":"Tworzenie bootstrappera aplikacji przy u\u017cyciu CaliburnMicro"},"content":{"rendered":"<p>Witam po d\u0142ugiej przerwie. W dzisiejszym wpisie postaram si\u0119 kr\u00f3tko opisa\u0107 w jaki spos\u00f3b stworzy\u0107 bootstrapper aplikacji przy u\u017cyciu CaliburnMicro. Ponadto przedstawi\u0119 w jaki spos\u00f3b skonfigurowa\u0107 bootstrapper w taki spos\u00f3b, aby Caliburn wykorzystywa\u0142 nasz w\u0142asny kontener IOC.<\/p>\n<h3>1. Wst\u0119p<\/h3>\n<p>CaliburnMicro jest to framework MVVM, kt\u00f3ry w znacznym stopniu u\u0142atwia i przy\u015bpiesza pisanie aplikacji pod WPF,Silverlight,WindowsPhone oraz WinRT. Zdecydowa\u0142em si\u0119 pozna\u0107 ten framework z uwagi na jego przeno\u015bno\u015b\u0107 na r\u00f3\u017cne platformy. Wcze\u015bniej ca\u0142kiem sporo czasu po\u015bwi\u0119ci\u0142em Prismowi, jednak\u017ce z powodu licznych problem\u00f3w z jego dzia\u0142aniem pod WindowsPhonem chcia\u0142em spr\u00f3bowa\u0107 czego\u015b nowego.<\/p>\n<h3>2. Bootstrapper &#8211; Silverlight<\/h3>\n<p>Bootstrapper jest to og\u00f3lnie rzecz bior\u0105c klasa inicjalizuj\u0105ca ca\u0142\u0105 aplikacj\u0119. W trakcie odpalania bootstrappera na og\u00f3\u0142 konfiguruje si\u0119 kontener IOC(rejestruje wszystkie potrzebne typu), inicjalizuje si\u0119 po\u0142\u0105czenie z serverem, oraz odpala si\u0119 g\u0142\u00f3wne okno aplikacji &#8211; tzw. Shella. Dlatego te\u017c musimy odchudzi\u0107 plik App.xaml.cs i zostawi\u0107 w nim jedynie konstruktor wraz z wywo\u0142aniem funkcji InitializeComponents()<\/p>\n<pre lang=\"csharp\">\r\npublic partial class App : Application\r\n{\r\n    public App()\r\n    {          \r\n        InitializeComponent();\r\n    }\r\n}\r\n<\/pre>\n<p>Zacznijmy od utworzenia nowego projektu typu SilverlightApplication, do kt\u00f3rego dodajemy referencje do dll-ek Cliburna. Mo\u017cemy to zrobi\u0107 poprzez NuGetta (niestety u mnie one nie dzia\u0142a\u0142y :D), jak r\u00f3wnie\u017c mo\u017cemy je \u015bci\u0105gn\u0105\u0107 z oficjalnej strony projektu http:\/\/caliburnmicro.codeplex.com\/releases\/view\/81466. Nast\u0119pnie stw\u00f3rzmy g\u0142\u00f3wne okno aplikacji(wspomnianego wcze\u015bniej Shella) oraz jego viewmodel. W tym celu dodajemy do projektu Silverlight User Control o nazwie ShellView<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellView.jpg\" rel=\"attachment wp-att-427\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellView.jpg\" alt=\"ShellView\" width=\"600\" class=\"aligncenter size-full wp-image-427\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellView.jpg 953w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellView-150x93.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellView-300x187.jpg 300w\" sizes=\"(max-width: 953px) 100vw, 953px\" \/><\/a><br \/>\noraz now\u0105 klas\u0119 ShellViewModel.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewModel.jpg\" rel=\"attachment wp-att-429\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewModel.jpg\" alt=\"ShellViewModel\" width=\"600\" class=\"aligncenter size-full wp-image-429\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewModel.jpg 958w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewModel-150x92.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewModel-300x185.jpg 300w\" sizes=\"(max-width: 958px) 100vw, 958px\" \/><\/a><br \/>\nDorzu\u0107my jeszcze jakiego\u015b TextBox-a do naszego ShellView, tak aby mie\u0107 pewno\u015b\u0107, \u017ce rzeczywi\u015bcie odpowiednie okno jest widoczne przy starcie aplikacji<\/p>\n<pre lang=\"xml\">\r\n<UserControl x:Class=\"Loginv2.ShellView\"\r\n    xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\r\n    xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\r\n    xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\r\n    xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\"\r\n             xmlns:cal=\"clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro\" mc:Ignorable=\"d\" Height=\"516\" Width=\"792\">\r\n\r\n    <Grid x:Name=\"LayoutRoot\"  >\r\n        <TextBox Text=\"oto jest shell\"\/>\r\n    <\/Grid>\r\n<\/UserControl><\/pre>\n<p>W kolejnym kroku musimy stworzy\u0107 w\u0142a\u015bciwy bootstrapper &#8211; dodajmy now\u0105 klas\u0119 o nazwie SilverlightBootstrapper, kt\u00f3ra dziedziczy\u0107 b\u0119dzie po klasie Bootstrapper<\/p>\n<pre lang=\"csharp\">\r\nnamespace Client.Silverlight\r\n{\r\n    public class SilverlightBootstrapper : Bootstrapper<ShellViewModel>\r\n    {\r\n    \r\n    }\r\n}\r\n<\/pre>\n<p>Klasa Bootstrapper jest to klasa dostarczona przez CaliburnMicro, generyczny parametr T okre\u015bla nam viewmodel na podstawie kt\u00f3rego framework b\u0119dzie wyszukiwa\u0142 odpowiedni widok shella ze swojego wbudowanego kontenera IOC (Caliburn podczas uruchomienia aplikacji rejestruje dost\u0119pne typu w kontenerze). Zgodnie z domy\u015bln\u0105 konwencj\u0105, CaliburnMicro jako g\u0142\u00f3wne okno aplikacji ustawi widok, kt\u00f3ry nazywa\u0107 si\u0119 b\u0119dzie ShellView. W celu odpalenia naszego bootstrappera musimy jeszcze umie\u015bci\u0107 go w zasobach aplikacji. Zmodyfikujmy zatem plik App.xaml aby wygl\u0105da\u0142 w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"xml\">\r\n<Application xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\r\n             xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\r\n             xmlns:Silverlight=\"clr-namespace:Client.Silverlight\" x:Class=\"Client.Silverlight.App\">\r\n    <Application.Resources>\r\n        <Silverlight:SilverlightBootstrapper x:Key=\"Bootstrapper\"><\/Silverlight:SilverlightBootstrapper>\r\n    <\/Application.Resources>\r\n<\/Application>\r\n<\/pre>\n<p>Kompiluj\u0105c, a nast\u0119pnie uruchamiaj\u0105c nasz projekt naszym oczom powinien ukaza\u0107 si\u0119 nast\u0119puj\u0105cy widok<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/Client.Silverlight.jpg\" rel=\"attachment wp-att-425\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/Client.Silverlight.jpg\" alt=\"Client.Silverlight\" width=\"600\" class=\"aligncenter size-full wp-image-425\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/Client.Silverlight.jpg 851w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/Client.Silverlight-150x105.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/Client.Silverlight-300x210.jpg 300w\" sizes=\"(max-width: 851px) 100vw, 851px\" \/><\/a><\/p>\n<p>Powy\u017cej przedstawi\u0142em w jaki spos\u00f3b stworzy\u0107 najprostsz\u0105 wersj\u0119 bootstrapera z wykorzystaniem CaliburnMicro oraz jego domy\u015blnego kontenera IOC. Jednak\u017ce najcz\u0119\u015bciej jest tak, \u017ce w aplikacji wykorzystujemy ju\u017c jaki\u015b bardziej zaawansowany kontener i po prostu nie chcemy wykorzystywa\u0107 jednego kontenera do &#8220;rozwi\u0105zywania&#8221; widok\u00f3w, a drugiego do pozosta\u0142ych rzeczy. Dlatego te\u017c poka\u017ce teraz w jaki spos\u00f3b skonfigurowa\u0107 napisany wcze\u015bniej bootstrapper tak aby widoki by\u0142y wyci\u0105gane z naszego kontenera IOC. Zacznijmy do dodania do naszego projektu referencji do NInjecta, a nast\u0119pnie utw\u00f3rzmy klas\u0119 IOCContainer (b\u0119d\u0105c\u0105 naszym customowym kontenerem), wygl\u0105daj\u0105c\u0105 w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\npublic class IOCContainer\r\n{\r\n    private static readonly IKernel Kernel = new StandardKernel();\r\n\r\n    protected IOCContainer()\r\n    {\r\n\r\n    }\r\n\r\n    public static void Dispose()\r\n    {\r\n        Kernel.Dispose();\r\n    }\r\n\r\n    public static object Get(Type type)\r\n    {\r\n        return Kernel.Get(type);\r\n    }\r\n\r\n    public static object Get(Type type,string key)\r\n    {\r\n        return Kernel.Get(type, key);\r\n    }\r\n  \r\n    public static IEnumerable<object>  GetAll(Type instanceType)\r\n    {\r\n        return Kernel.GetAll(instanceType);\r\n    }\r\n  \r\n    public static void Bind<T, TS>() where TS : T\r\n    {\r\n        Kernel.Bind<T>().To<TS>();\r\n    } \r\n}\r\n<\/pre>\n<p>Nast\u0119pnie w klasie SilverlightBootstraper musimy przeci\u0105\u017cy\u0107 funkcj\u0119 Configure,GetAllInstances oraz GetInstance. Jako, \u017ce b\u0119dziemy korzystali z naszego w\u0142asnego kontenera w funkcji Configure rejestrujemy wszystkie potrzebne nam viewmodele oraz widoki. Zatem funkcja Configure powinna od teraz wygl\u0105da\u0107 tak<\/p>\n<pre lang=\"csharp\">\r\nprotected override void Configure()\r\n{\r\n    IOCContainer.Bind<ShellView,ShellView>();\r\n    IOCContainer.Bind<ShellViewModel,ShellViewModel>();\r\n}\r\n<\/pre>\n<p>Nast\u0119pnie musimy &#8220;pokaza\u0107&#8221; Caliburn-owi gdzie powinien szuka\u0107 widok\u00f3w. Dlatego te\u017c przeci\u0105\u017camy funkcje GetInstance oraz GetAllInstances i zmieniamy ich posta\u0107 na nast\u0119puj\u0105c\u0105<\/p>\n<pre lang=\"csharp\">\r\nprotected override object GetInstance(Type serviceType, string key)\r\n{\r\n    return IOCContainer.Get(serviceType, key);\r\n}\r\n\r\nprotected override IEnumerable<object> GetAllInstances(Type serviceType)\r\n{\r\n    return IOCContainer.GetAll(serviceType);\r\n}\r\n<\/pre>\n<p>Od tej pory, za ka\u017cdym razem gdy u\u017cyjemy mechanizm\u00f3w Caliburna do bindowania viewmodelu z widokiem itp.,Caliburm b\u0119dzie szuka\u0142 widok\u00f3w oraz viewmodeli w naszym kontenerze IOC.<\/p>\n<h4>2.2 W\u0142asna konwencja wyszukiwania widok\u00f3w<\/h4>\n<p>W przedstawionym powy\u017cej przyk\u0142adzie bootstrappera, nasz bootstrapper korzysta\u0142 z domy\u015blnej konwencji rozwi\u0105zywania widok\u00f3w na podstawie viewmodeli (do ShellViewModel zosta\u0142 dopasowany widok ShellView). Czasem jednak konwencja ta, nie pasuje do konwencji przyj\u0119tej w danym projekcie. Sam bior\u0119 udzia\u0142 w projekcie, w kt\u00f3rym widoki w kontenerze s\u0105 rejestrowane nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\nIOCContainer.Bind<IView<ViewModel>,View>\r\n<\/pre>\n<p>Czy zatem oznacza to, \u017ce nie mog\u0119 korzysta\u0107 ju\u017c mechanizm\u00f3w Caliburna i musze zrezygnowa\u0107 chocia\u017cby z bootstrappera ?Oczywi\u015bcie,\u017ce nie. Framework dostarcza nam mo\u017cliwo\u015b\u0107 zdefiniowania w\u0142asnej konwencji wyszukiwania widok\u00f3w na podstawie viewmodeli. W celu zast\u0105pienia domy\u015blnej konwencji musimy podpi\u0105\u0107 si\u0119 pod propercj\u0119 LocateForModelType znajduj\u0105c\u0105 si\u0119 w klasie ViewLocator i zdefiniowa\u0107 w\u0142asn\u0105 funkcj\u0119 wyszukuj\u0105c\u0105 widok na podstawie viewmodelu. W moim przypadku wygl\u0105da to w nast\u0119puj\u0105cy spos\u00f3b<\/p>\n<pre lang=\"csharp\">\r\nViewLocator.LocateForModelType = (modelType, displayLocation, context) =>\r\n                                                 {\r\n                                                     string viewTypeName = string.Format(\"{0}[[{1}]],{2}\", typeof(IView<>).FullName, modelType.AssemblyQualifiedName, typeof(IView<>).Assembly.FullName);\r\n                                                     Type viewType = Type.GetType(viewTypeName);\r\n                                                     if (viewType == null)\r\n                                                         throw new ArgumentNullException(string.Format(\"Nie odnaleziono typu widoku dla viewModelu\"), modelType.FullName);\r\n\r\n                                                     return ViewLocator.GetOrCreateViewType(viewType);\r\n                                                 };\r\n<\/pre>\n<p>Funkcja ViewLocator.LocateForModelType odpalana jest za ka\u017cdym razem, gdy CaliburnMicro chce wyszuka\u0107 widok na podstawie viewmodleu. Najwa\u017cniejszym argumentem funkcji LocateForModelType jest modelType &#8211; czyli typ viewmodelu, kt\u00f3ry pos\u0142u\u017cy nam do znalezienia widoku &#8211; a w\u0142a\u015bciwie jego typu. Po odnalezieniu typu widoku, wywo\u0142ujemy funkcj\u0119<\/p>\n<pre lang=\"csharp\">\r\nViewLocator.GetOrCreateViewType(viewType);\r\n<\/pre>\n<p>(kt\u00f3re z kolei znajdzie nam w kontenerze po\u017c\u0105danym przez nas typ widoku) i zwracamy jej rezultat.<\/p>\n<h3>3. Bootstrapper &#8211; Windows Phone<\/h3>\n<p>W przypadku bootstrappera dla Windows Phona sytuacja wygl\u0105da odrobin\u0119 inaczej. W celu utworzenia w\u0142asnego bootstrappera musimy rozszerzy\u0107 klas\u0119 PhoneBootstrapper. Utw\u00f3rzmy zatem nowy projekt typu Windows Phone Application, oraz dodajmy do niego now\u0105 kontrolk\u0119 typu Windows Phone Portrait Page.<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewPortrait.jpg\" rel=\"attachment wp-att-430\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewPortrait.jpg\" alt=\"ShellViewPortrait\" width=\"600\" class=\"aligncenter size-full wp-image-430\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewPortrait.jpg 954w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewPortrait-150x104.jpg 150w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewPortrait-300x207.jpg 300w\" sizes=\"(max-width: 954px) 100vw, 954px\" \/><\/a><br \/>\nPodobnie jak w przypadku projektu Silverlightowego dodajemy referencj\u0119 do CaliburnMicro ,dorzucamy klas\u0119 viewmodelu (kt\u00f3r\u0105 nazywamy ShellViewModel) oraz dodajemy jakiego\u015b textboxa do ShellView. Nast\u0119pnie musimy utworzy\u0107 nasz bootstrapper, dodajmy zatem klas\u0119 WindowsPhoneBootstrapper rozszerzaj\u0105c\u0105 klas\u0119 PhoneBootstrapper. Podobnie jak w przypadku bootstrappera silverlightowego przeci\u0105\u017camy funkcje odpowiedzialne za konfiguracj\u0119 kontenera IOC.<\/p>\n<pre lang=\"csharp\">\r\npublic class WindowsPhoneBootstrapper : PhoneBootstrapper\r\n{\r\n    protected override void Configure()\r\n    {\r\n      \r\n       IOCContainer.BindToConstant<INavigationService>(new FrameAdapter(RootFrame));\r\n       IOCContainer.BindToConstant<IPhoneService>(new PhoneApplicationServiceAdapter(RootFrame));\r\n       IOCContainer.BindAsSingleton<ShellViewModel, ShellViewModel>();\r\n    }\r\n\r\n    protected override void OnExit(object sender, EventArgs e)\r\n    {\r\n        IOCContainer.Dispose();\r\n        base.OnExit(sender, e);\r\n    }\r\n\r\n    protected override object GetInstance(Type serviceType, string key)\r\n    {\r\n        return IOCContainer.Get(serviceType, key);\r\n    }\r\n\r\n    protected override IEnumerable<object> GetAllInstances(Type serviceType)\r\n    {\r\n        return IOCContainer.GetAll(serviceType);\r\n    }\r\n\r\n    protected override void BuildUp(object instance)\r\n    {\r\n        IOCContainer.Inject(instance);\r\n    }\r\n}\r\n<\/pre>\n<p>Zwr\u00f3\u0107my uwag\u0119, \u017ce w kontenerze IOC zosta\u0142y zarejestrowane us\u0142ugi nawigacji Windows Phona, do kt\u00f3rych zosta\u0142 przekazany RootFrame. RootFrame jest to g\u0142\u00f3wne okno aplikacji, zostaje ono utworzone przez CliburnMicro. Tak samo jak w przypadku projektu Silverlightowego w pliku App.xaml.cs zostawiamy jedynie konstruktor z wywo\u0142aniem funkcji InitializeComponents(). W celu ustawienia ShellView jako RootFram-a musimy zmodyfikowa\u0107 plik WMAppManifest.xml (znajduj\u0105cy si\u0119 w katalogu Properties). Odnajdujemy tam wpis<\/p>\n<pre lang=\"xml\">\r\n<DefaultTask  Name =\"_default\" NavigationPage=\"MainPage.xaml\"\/>\r\n<\/pre>\n<p>i zamieniamy go na<\/p>\n<pre lang=\"xml\">\r\n<DefaultTask  Name =\"_default\" NavigationPage=\"ShellView.xaml\"\/>\r\n<\/pre>\n<p>Jak wida\u0107 WindowsPhone wymusza tutaj podej\u015bcie ViewFirst. Przy uruchomieniu aplikacji mechanizm nawigacji WindowsPhona odpali widok ShellView (bez wiedzy Caliburn&#8217;a), natomiast CaliburnMicro dopasuje odpowiedni ViewModel do naszego widoku &#8211; na podstawie domy\u015blnej konwencji. Je\u017celi chcieliby\u015bmy zmodyfikowa\u0107 spos\u00f3b wyszukiwania ViewModeli do widok\u00f3w musimy podpi\u0105\u0107 si\u0119 do propertisa LocateForViewType znajduj\u0105cego si\u0119 w klasie ViewModelLocator<\/p>\n<pre lang=\"csharp\">\r\nViewModelLocator.LocateForViewType = type => { return \/\/tutaj zwroc odpowiedni viewmodel na podstawie parametru type; };\r\n<\/pre>\n<p>W ostatnim kroku musimy jeszcze tylko doda\u0107 nasz bootstrapper do zasob\u00f3w aplikacji<\/p>\n<pre lang=\"xml\">\r\n<Application.Resources>\r\n        <Bootstrapper:WindowsPhoneBootstrapper x:Key=\"Bootstrapper\"><\/Bootstrapper:WindowsPhoneBootstrapper>\r\n<\/Application.Resources>\r\n<\/pre>\n<p>odpalaj\u0105c teraz program naszym oczom powinien ukaza\u0107 si\u0119 taki oto widok<br \/>\n<a href=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewEmulator.jpg\" rel=\"attachment wp-att-428\"><img decoding=\"async\" src=\"http:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewEmulator.jpg\" alt=\"CaliburnMicro\" height=\"709\" class=\"aligncenter size-full wp-image-428\" srcset=\"https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewEmulator.jpg 382w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewEmulator-81x150.jpg 81w, https:\/\/tpodolak.com\/blog\/wp-content\/uploads\/2012\/05\/tworzenie-bootstrappera-aplikacji-przy-uzyciu-caliburnmicro\/ShellViewEmulator-162x300.jpg 162w\" sizes=\"(max-width: 382px) 100vw, 382px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Witam po d\u0142ugiej przerwie. W dzisiejszym wpisie postaram si\u0119 kr\u00f3tko opisa\u0107 w jaki spos\u00f3b stworzy\u0107 bootstrapper aplikacji przy u\u017cyciu CaliburnMicro. Ponadto przedstawi\u0119 w jaki spos\u00f3b skonfigurowa\u0107 bootstrapper w taki spos\u00f3b, aby Caliburn wykorzystywa\u0142 nasz w\u0142asny kontener IOC. 1. Wst\u0119p CaliburnMicro jest to framework MVVM, kt\u00f3ry w znacznym stopniu u\u0142atwia i przy\u015bpiesza pisanie aplikacji pod WPF,Silverlight,WindowsPhone [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[111,43,110,30,45],"tags":[245,189,246,240,191],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-caliburnmicro","category-mvvm","category-silverlight5","category-windows-phone","category-wpf","tag-caliburnmicro","tag-mvvm","tag-silverlight5","tag-windows-phone","tag-wpf"],"_links":{"self":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":6,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"predecessor-version":[{"id":556,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/posts\/50\/revisions\/556"}],"wp:attachment":[{"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tpodolak.com\/blog\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}