Summary: We need to Unity/Mef Bootstrap into Shell as Top Window, where two things happen: the normal WPF Window.Show() and enable Dependency Injection (DI) as early as possible using UnityContainer.Resolve<Shell> or CompositeContainer.GetExportTypes<>. Note that basic services like EventAggregator are constructed by Unity/Mef and will be passed along through Container/Aggregate Catalog. Note that WPF DataContext is set in ShellWindos Constructor for Unity and DInjected for Mef through [Import]. bootstrapper.cs #region Unity Bootstrapper class DemoUnityBootstrapper : UnityBootstrapper { protected override System.Windows.DependencyObject CreateShell() { return Container.Resolve<ShellWindow>(); // must be resolved by Container to do DI } protected override void InitializeShell() { (Application.Current.MainWindow =(Window) Shell).Show(); } } #endregion #region Mef Bootstrapping class DemoMefBootstrapper : MefBootstrapper { protected override System.Windows.DependencyObject CreateShell() { return new ShellWindow2(Container,AggregateCatalog); //avoid DI [Export] on ShellWindow2 } protected override void InitializeShell() { (Application.Current.MainWindow = (Window)Shell).Show(); } } #endregion App Startup protected override void OnStartup(StartupEventArgs e) { DemoUnityBootstrapper dub = new DemoUnityBootstrapper(); dub.Run(true); DemoMefBootstrapper dmb = new DemoMefBootstrapper(); dmb.Run(true); } Shell as Window public ShellWindow(IUnityContainer container) //DI { InitializeComponent(); // again, DI require Container.Resolve. var vm = container.Resolve<PrismDemo.MVVM.ViewModel>(); var view = container.Resolve<PrismDemo.MVVM.View>(); view.DataContext = vm; cc.Content = view; } public ShellWindow2(CompositionContainer c, AggregateCatalog a) //not DI { InitializeComponent(); a.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); IView v2 = c.GetExportedValue<IView>(); // invoke Import-Export matching on V cc.Content = v2; } View for Mef only, Unity has no code [Export(typeof(IView))] // for Container.GetExportpublic partial class View2 : UserControl , IView { public View2() { InitializeComponent(); } [Import] // Import will Match Export of VM2 public ViewModel2 ViewModel { set { this.DataContext = value; } } // declare which view is it for Modularity public string ViewName { get { return "View2"; } set { throw new NotImplementedException(); } } } Xaml <Grid> <StackPanel> <TextBlock Background="#FF15ABB7">MVVM View, Data binding</TextBlock> <TextBox Text="{Binding Path=SingleValue, Mode=TwoWay}" /> </StackPanel> </Grid> ViewMode public class ViewModel : INotifyPropertyChanged { IEventAggregator _eventAggregator; public ViewModel(IEventAggregator ea) //Unity Ctor DI { _eventAggregator = ea; } string _SingleValue="test"; public string SingleValue { get { return _SingleValue;} set { _SingleValue=value; PropertyChanged(this, new PropertyChangedEventArgs("SingleValue")); Debug.Assert(_eventAggregator != null); // test Event Aggregator get DInjected } } public event PropertyChangedEventHandler PropertyChanged; } [Export(typeof(ViewModel2))] public class ViewModel2 : NotificationObject { [Import] // Exported by Mef base Aggregate Catalog public IEventAggregator ea { get; set; } IEventAggregator propEa; [ImportingConstructor] public ViewModel2(IEventAggregator ea2) { propEa = ea2; } string _SingleValue = "test"; public string SingleValue { get { return _SingleValue; } set { _SingleValue = value; RaisePropertyChanged("SingleValue"); Debug.Assert(ea != null & propEa != null); // test Event Aggregator get DInjected as Ctor and Prop } } }
Blog Archive
-
▼
2012
(34)
-
▼
July
(9)
- Parallel.For vs. Synchronization using ManualReset...
- Implement Asyn WCF using Task in .Net 4.0
- High Performance WPF/WCF
- WPF Prism MVVM using Unity and Mef
- Trading Signals from EMA and RSI
- Interesting javascript code
- State Machine Desing Pattern
- IoC inject data into DropDownListFor
- Using AutoFac IocContainer to inject Log4Net into ...
-
▼
July
(9)
Tuesday, July 17, 2012
WPF Prism MVVM using Unity and Mef
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment