ããããããã®ã¢ãŒããã¯ãã£ã§WPFã¢ããªã±ãŒã·ã§ã³ãäœæããããã®æãæåãªãã¬ãŒã ã¯ãŒã¯ã¯Prismã§ãã ãã®èšäºã§ã¯ãæ¯èŒåæãè¡ããŸããã Prismã®äœ¿çšçµéšã¯ãããŸããã ãã¥ãŒããªã¢ã«ãèªãã åŸããã¹ãŠã®ãªãŒãžã§ã³ãmefãããã³ãã®ä»ã®ã¢ãŒãã£ãã¡ã¯ããå«ãPrismã¯ãéåžžã«è€éã«æããŸããã Prismãç¥ã£ãŠããèªè ããç§ãééã£ãŠããããšãšããã®ãã¬ãŒã ã¯ãŒã¯ã®å©ç¹ãåççã«ææããŠãããããæè¬ããŸãã
ãã®èšäºã§ã¯ããããã®ããŒã«ã䜿çšããåçŽãªã¢ãžã¥ãŒã«åŒã¢ããªã±ãŒã·ã§ã³ã®éçºã«ã€ããŠèª¬æããŸãã
Caliburn.Micro
Caliburn.Microã¯ãViewããã³ViewModelã®èšè¿°ãå€§å¹ ã«ç°¡çŽ åãããã¬ãŒã ã¯ãŒã¯ã§ãã å®éã圌èªèº«ãåœåèŠåã«åºã¥ããŠãã€ã³ããŒãäœæããŠãããããéçºè ã¯æäœæ¥ã§ãã€ã³ããŒãäœæããå¿ èŠããªããã³ãŒããããå°ããããããããã«ããããšãã§ããŸãã ããã«åœŒãã®ãµã€ãããã®ããã€ãã®äŸããããŸãïŒ
<ListBox x:Name="Products" />
public BindableCollection<ProductViewModel> Products { get; private set; } public ProductViewModel SelectedProduct { get { return _selectedProduct; } set { _selectedProduct = value; NotifyOfPropertyChange(() => SelectedProduct); } }
ãã®XAMLã§ã¯ãItemSourceãŸãã¯SelectedItemã®ããããæå®ããŠããŸããã
<StackPanel> <TextBox x:Name="Username" /> <PasswordBox x:Name="Password" /> <Button x:Name="Login" Content="Log in" /> </StackPanel>
public bool CanLogin(string username, string password) { return !String.IsNullOrEmpty(username) && !String.IsNullOrEmpty(password); } public string Login(string username, string password) { ... }
ã³ãã³ããšCommandParameterã¯ãããŸããã
å¿ èŠã«å¿ããŠãå¥çŽãåå®çŸ©ã§ããŸãã
ãã¡ãããCaliburn.Microã«ã¯ãã£ãšããããšããããŸãã ããã«æ€èšããŸããæ®ãã¯ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã
Castle.windsor
Castle.Windsorã¯ã.netã§æãæåã§æãæ©èœçãªDIã³ã³ãããŒã®1ã€ã§ãïŒèªè ã¯DIããã³IoCãèªèããŠãããšæ³å®ãããŸãïŒã ã¯ããCaliburn.Microã¯ãä»ã®å€ãã®ãã¬ãŒã ã¯ãŒã¯ãšåæ§ã«ãç¬èªã®DIã³ã³ããSimpleContainerãåããŠããããããªãäŸãšããŠã¯ããã®æ©èœã§ååã§ãã ããããããè€éãªã¿ã¹ã¯ã®å Žåã¯é©åã§ã¯ãªãå¯èœæ§ããããããäŸãšããŠCastle.Windsorã䜿çšããŠä»»æã®ã³ã³ããã䜿çšããæ¹æ³ã瀺ããŸãã
ææŠãã
äŸãšããŠãåçŽãªã¢ãžã¥ãŒã«åŒã¢ããªã±ãŒã·ã§ã³ãäœæããããã»ã¹ãæ€èšããããšãææ¡ããŸãã ãã®äž»èŠéšå-ã·ã§ã«-ã¯ãŠã£ã³ããŠã§ããããã®å·ŠåŽã«ListBoxã¡ãã¥ãŒããããŸãã ã¡ãã¥ãŒé ç®ãéžæãããšã察å¿ãããã©ãŒã ãå³åŽã«è¡šç€ºãããŸãã ã¡ãã¥ãŒã¯ãããŒãæãŸãã¯æäœäžã«ã¢ãžã¥ãŒã«ã§æºããããŸãã ã¢ãžã¥ãŒã«ã¯ãã·ã§ã«ã®éå§æãšæäœäžã®äž¡æ¹ã§ããŒãã§ããŸãïŒããšãã°ãã¢ãžã¥ãŒã«ã¯å¿ èŠã«å¿ããŠä»ã®ã¢ãžã¥ãŒã«ãããŒãã§ããŸãïŒã
å¥çŽ
ãã¹ãŠã®ã³ã³ãã©ã¯ãã¯ãã³ã³ãã©ã¯ãã¢ã»ã³ããªã«å«ãŸããã·ã§ã«ãšã¢ãžã¥ãŒã«ãåç §ããå¿ èŠããããŸãã ã¿ã¹ã¯ã«åºã¥ããŠãã·ã§ã«ã®ã³ã³ãã©ã¯ããäœæããŸãã
public interface IShell { IList<ShellMenuItem> MenuItems { get; } IModule LoadModule(Assembly assembly); }
public class ShellMenuItem { public string Caption { get; set; } public object ScreenViewModel { get; set; } }
ããã§ã¯ãã¹ãŠãæ確ã ãšæããŸãã ã·ã§ã«ã䜿çšãããšãã¢ãžã¥ãŒã«ã§ã¡ãã¥ãŒã管çããããããã»ã¹ã§ã¢ãžã¥ãŒã«ãããŒããããã§ããŸãã ã¡ãã¥ãŒé ç®ã«ã¯è¡šç€ºåãšViewModelãå«ãŸãããã®ã¿ã€ãã¯çµ¶å¯Ÿã«ä»»æã§ãã ãŠã£ã³ããŠã®å³åŽã§ã¡ãã¥ãŒé ç®ãéžæãããšããã®ViewModelã«å¯Ÿå¿ãããã¥ãŒã衚瀺ãããŸãã é©åãªãã¥ãŒãå€æããæ¹æ³ã¯ïŒ Caliburn.MicroããããåŠçããŸãã ãã®ã¢ãããŒãã¯ViewModel-firstãšåŒã°ããŸããã³ãŒãã§ã¯ãã¥ãŒã¢ãã«ãæäœãããã¥ãŒã®äœæã¯èæ¯ã«ãã§ãŒãã€ã³ãããã¬ãŒã ã¯ãŒã¯ã®æã«å§ããããããã§ãã 詳现ã¯ä»¥äžã®éãã§ãã
ã¢ãžã¥ãŒã«ã³ã³ãã©ã¯ãã¯éåžžã«åçŽã«èŠããŸãã
public interface IModule { void Init(); }
InitïŒïŒã¡ãœããã¯ãã¢ãžã¥ãŒã«ã®ããŒããéå§ããããŒãã£ãåŒã³åºããŸãã
ã¢ã»ã³ããªããããžã§ã¯ãã§çœ²åãããéåžžã¯å€§èŠæš¡ãããžã§ã¯ãã§ããå Žåãã·ã§ã«ãšã¢ãžã¥ãŒã«ãåãããŒãžã§ã³ã®ã³ã³ãã©ã¯ããæã€ã¢ã»ã³ããªã䜿çšããããšã確èªããå¿ èŠãããããšã«æ³šæããããšãéèŠã§ãã
ã·ã§ã«ã䜿ãå§ãã
ã¿ã€ãWPFã¢ããªã±ãŒã·ã§ã³ã®ãããžã§ã¯ããäœæããŸãã 次ã«ãCaliburn.MicroãšCastle.WIndsorããããžã§ã¯ãã«æ¥ç¶ããå¿ èŠããããŸãã ãããè¡ãæãç°¡åãªæ¹æ³ã¯ãNuGetã䜿çšããããšã§ãã
PM> Install-Package Caliburn.Micro -Version 2.0.2
PM> Install-Package Castle.Windsor
ãã ããã¢ã»ã³ããªãããŠã³ããŒãããããèªåã§çµã¿ç«ãŠãããšãã§ããŸãã 次ã«ããããžã§ã¯ãã«2ã€ã®ãã©ã«ããŒãViewsãšViewModelsãäœæããŸãã ViewModelsãã©ã«ããŒã§ãShellViewModelã¯ã©ã¹ãäœæããŸãã INotifyPropertyChangedãå®è£ ããªãããã«ãCaliburn.Microã®PropertyChangedBaseããç¶æ¿ããŸãã ããã¯ãã·ã§ã«ã®ã¡ã€ã³ãŠã£ã³ããŠã®ãã¥ãŒã¢ãã«ã«ãªããŸãã
class ShellViewModel: PropertyChangedBase { public ShellViewModel() { MenuItems = new ObservableCollection<ShellMenuItem>(); } public ObservableCollection<ShellMenuItem> MenuItems { get; private set; } private ShellMenuItem _selectedMenuItem; public ShellMenuItem SelectedMenuItem { get { return _selectedMenuItem; } set { if(_selectedMenuItem==value) return; _selectedMenuItem = value; NotifyOfPropertyChange(() => SelectedMenuItem); NotifyOfPropertyChange(() => CurrentView); } } public object CurrentView { get { return _selectedMenuItem == null ? null : _selectedMenuItem.ScreenViewModel; } } }
ã¡ã€ã³ãŠã£ã³ããŠMainWindowèªäœããã¥ãŒã«ã³ããŒãããShellViewã«ååãå€æŽãããŸãã ãã¡ã€ã«ã ãã§ãªããåå空éãæã€ã¯ã©ã¹ã®ååãå¿ããªãã§ãã ããã ã€ãŸã Shell.MainWindowsã¯ã©ã¹ã®ä»£ããã«ãShell.Views.ShellViewãå¿ èŠã§ãã ããã¯éèŠã§ãã ããããªããšãCaliburn.Microã¯ã以åã«äœæãããã¢ãã«ãšäžèŽããã®ã¯ãã®ãã¥ãŒã§ãããšå€æã§ããŸããã åè¿°ã®ããã«ãCaliburn.Microã¯åœåèŠåã«äŸåããŠããŸãã ãã®å Žåããã¥ãŒã¢ãã«ã®ã¯ã©ã¹åãããã¢ãã«ããšããåèªãåé€ããã察å¿ãããã¥ãŒã®ã¯ã©ã¹åãååŸãããŸãïŒShell.ViewModels.ShellViewModel-Shell.Views.ShellViewïŒã Viewã®åœ¹å²ã¯ãWindowsãUserControlãPageã§ãã ã¢ãžã¥ãŒã«ã§ã¯ãUserControlã䜿çšããŸãã
ã¡ã€ã³ãŠã£ã³ããŠã®XAMlã¬ã€ã¢ãŠãã¯æ¬¡ã®ããã«ãªããŸãã
<Window x:Class="Shell.Views.ShellView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="200"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <ListBox x:Name="MenuItems" DisplayMemberPath="Caption" Grid.Column="0"/> <ContentControl x:Name="CurrentView" Grid.Column="1"/> </Grid> </Window>
Caliburn.Microãèµ·åããŸã
ãããè¡ãã«ã¯ãæåã«æå°éã®ã³ã³ãã³ãã§Bootstraperã¯ã©ã¹ãäœæããŸãã
public class ShellBootstrapper : BootstrapperBase { public ShellBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor<ShellViewModel>(); } }
BootstrapperBaseããç¶æ¿ããå¿ èŠããããŸãã OnStartupã¡ãœããã¯ãããã°ã©ã ã®èµ·åæã«åŒã³åºãããŸãã DisplayRootViewForïŒïŒã¯ãããã©ã«ãã§ã¯ãã¥ãŒã¢ãã«ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§äœæããäžèšã®ã¢ã«ãŽãªãºã ã䜿çšããŠå¯Ÿå¿ãããã¥ãŒãæ€çŽ¢ãã衚瀺ããŸãã
ãããæ©èœãããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãžã®ãšã³ããªãã€ã³ã-App.xamlãç·šéããå¿ èŠããããŸãã
<Application x:Class="Shell.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:shell="clr-namespace:Shell"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary> <shell:ShellBootstrapper x:Key="bootstrapper" /> </ResourceDictionary> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
StartupUriïŒããŒãã¹ãã©ããã«å²ãåœãŠãããŠããïŒãåé€ããããŒãã¹ãã©ããããªãœãŒã¹ã«è¿œå ããŸããã ãã®ãããªãã¹ãã¯ããã®ãããªãã®ã§ã¯ãããŸãããããã§ãªããã°ããããžã§ã¯ãã¯çµã¿ç«ãŠãããŸããã
ããã§ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãããŒãã¹ãã©ãããäœæãããOnStartupãåŒã³åºããããã¥ãŒã¢ãã«ã«é¢é£ä»ããããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã衚瀺ãããŸãã
ãã¥ãŒã¢ãã«ã®äœæã«æ³šæããŠãã ããã ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã£ãŠäœæãããŸãã ãããŠããã圌女ãæã£ãŠããªããã°ïŒ 圌女ãä»ã®ãšã³ãã£ãã£ã«äŸåããŠããå ŽåããŸãã¯ä»ã®ãšã³ãã£ãã£ã圌女ã«äŸåããŠããŸããïŒ Castle.Windsorã®DIã³ã³ãããå®è¡ããæãæ¥ããšæããŸãã
Castle.Windsorãèµ·åãã
ShellInstallerã¯ã©ã¹ãäœæããŸãã
class ShellInstaller : IWindsorInstaller { public void Install(IWindsorContainer container, IConfigurationStore store) { container .Register(Component.For<IWindsorContainer>().Instance(container)) .Register(Component.For<ShellViewModel>() /*.LifeStyle.Singleton*/); } }
ãã®äžã§ãæµãããããªæ§æã䜿çšããŠããã¹ãŠã®ã³ã³ããŒãã³ããã³ãŒãã«ç»é²ããŸãã xmlã䜿çšããŠãããè¡ãããšãã§ããŸãããµã€ãã®ããã¥ã¡ã³ããåç §ããŠãã ããã ãããŸã§ã®ãšãããã¡ã€ã³ãŠã£ã³ããŠã®ãã¥ãŒã¢ãã«ãšãã1ã€ã®ã³ã³ããŒãã³ãããããŸãã ãããã·ã³ã°ã«ãã³ãšããŠç»é²ããŸãïŒããã¯ããã©ã«ãã§LifeStyleã§ãããããæ瀺çã«æå®ããããšã¯ã§ããŸããïŒã ãŸããã³ã³ããã«ã¢ã¯ã»ã¹ã§ããããã«ãã³ã³ããèªäœãç»é²ããŸãã ä»åŸã®äºå®-ã¢ãžã¥ãŒã«ãããŒããããšãã«ãããå¿ èŠã«ãªããŸãã
次ã«ãããŒãã¹ãã©ããã«å€æŽãå ããŸãã
public class ShellBootstrapper : BootstrapperBase { private readonly IWindsorContainer _container = new WindsorContain-er(); public ShellBootstrapper() { Initialize(); } protected override void OnStartup(object sender, StartupEventArgs e) { DisplayRootViewFor<ShellViewModel>(); } protected override void Configure() { _container.Install(new ShellInstaller()); } protected override object GetInstance(Type service, string key) { return string.IsNullOrWhiteSpace(key) ? _container.Kernel.HasComponent(service) ? _container.Resolve(service) : base.GetInstance(service, key) : _container.Kernel.HasComponent(key) ? _container.Resolve(key, service) : base.GetInstance(service, key); } }
ã³ã³ãããäœæããŸãã åå®çŸ©ãããConfigureã¡ãœããã§ã¯ãã€ã³ã¹ããŒã©ãŒã䜿çšããŸãã GetInstanceã¡ãœããããªãŒããŒã©ã€ãããŸãã åºæ¬çãªå®è£ ã§ã¯ãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠãªããžã§ã¯ããäœæããŸãã ã³ã³ãããããªããžã§ã¯ããååŸããããšããŸãã
ã¢ãžã¥ãŒã«ãšã®çžäºäœçš
ãŸããã¢ãžã¥ãŒã«ãããŒãããæ¹æ³ãåŠã¶å¿ èŠããããŸãã ãããŠããã®ããã«ãã¢ãžã¥ãŒã«ãšã¯äœãã決ããŸããããïŒ
ã¢ãžã¥ãŒã«ïŒãã®å ŽåïŒã¯ãå¿ èŠãªæ©èœãå®è£ ããã¯ã©ã¹ã®ã»ãããå«ãã¢ã»ã³ããªã§ãã ãããã®ã¯ã©ã¹ã®1ã€ã¯ãIModuleã³ã³ãã©ã¯ããå®è£ ããå¿ èŠããããŸãã ããã«ãã·ã§ã«ãšåæ§ã«ãã¢ãžã¥ãŒã«ã«ã¯ãDIã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã®ã³ã³ããŒãã³ãïŒã¯ã©ã¹ïŒãç»é²ããã€ã³ã¹ããŒã©ãŒãå¿ èŠã§ãã
次ã«ãããŒãããŒããŒã®å®è£ ãéå§ããŸãããã ããŠã³ããŒãã¯ãã·ã§ã«ã®èµ·åæã«åŒã³åºãããããã»ã¹å ã§åŒã³åºãããšãã§ãããããå¥ã®ã¯ã©ã¹ãäœæããŸãã
class ModuleLoader { private readonly IWindsorContainer _mainContainer; public ModuleLoader(IWindsorContainer mainContainer) { _mainContainer = mainContainer; } public IModule LoadModule(Assembly assembly) { try { var moduleInstaller = FromAssembly.Instance(assembly); var modulecontainer = new WindsorContainer(); _mainContainer.AddChildContainer(modulecontainer); modulecontainer.Install(moduleInstaller); var module = modulecontainer.Resolve<IModule>(); if (!AssemblySource.Instance.Contains(assembly)) AssemblySource.Instance.Add(assembly); return module; } catch (Exception ex) { //TODO: good exception handling return null; } } }
ã·ã§ã«ã³ã³ãããŒããã¶ã€ããŒãéããŠè¡šç€ºãããŸãïŒããã®ããã«ç¹å¥ã«ç»é²ããŸãããïŒïŒã LoadModuleã¡ãœããã§ã¯ãã¢ãžã¥ãŒã«ã¢ã»ã³ããªããã€ã³ã¹ããŒã©ãŒãååŸããŸãã ããŒãå¯èœãªã¢ãžã¥ãŒã«ã®ã³ã³ããŒãã³ãçšã«åå¥ã®ã³ã³ãããäœæããŸãã ã·ã§ã«ã³ã³ããã«é¢é£ããŠåãšããŠç»é²ããŸãã ã€ã³ã¹ããŒã©ãŒã¢ãžã¥ãŒã«ã䜿çšããŸãã IModuleã®ã€ã³ã¹ã¿ã³ã¹ãè¿ãããšããŠããŸãã Caliburn.Microã«ã¢ã»ã³ããªãéç¥ããã¢ã»ã³ããªå ã®ã³ã³ããŒãã³ãã®åœåèŠåãé©çšããŸãã
ãŸããShellInstallerã«ã¢ãžã¥ãŒã«ããŒããŒãç»é²ããããšãå¿ããªãã§ãã ããã
.Register(Component.For<ModuleLoader>()
ãåã³ã³ãããã«ã€ããŠå°ãã äžçªäžã®è¡ã¯ããã®ãã¹ãŠã®ã³ã³ããŒãã³ãããç¬èªã®ã³ã³ããã«å ããŠã芪ã³ã³ããã®ã³ã³ããŒãã³ãããèŠããããšã§ããããã®éã¯ããã§ã¯ãããŸããã ç°ãªãåã³ã³ããã®ã³ã³ããŒãã³ãããäºãã«ã€ããŠäœãç¥ããŸããã ç§ãã¡ã¯ã·ã§ã«ãã¢ãžã¥ãŒã«ããåé¢ããã¢ãžã¥ãŒã«ãäºãã«åé¢ããŸãããã·ã§ã«ããã¯åé¢ããŸãã-圌ãã¯ãããèŠãŸãã
次ã«ãã¢ãžã¥ãŒã«ãã·ã§ã«ã«ã¢ã¯ã»ã¹ããããã®IShellã³ã³ãã©ã¯ããå®è£ ããŸãã
class ShellImpl: IShell { private readonly ModuleLoader _loader; private readonly ShellViewModel _shellViewModel; public ShellImpl(ModuleLoader loader, ShellViewModel shellViewModel) { _loader = loader; _shellViewModel = shellViewModel; } public IList<ShellMenuItem> MenuItems { get { return _shellViewModel.MenuItems; } } public IModule LoadModule(Assembly assembly) { return _loader.LoadModule(assembly); } }
ç»é²ããŸãã
.Register(Component.For<IShell>().ImplementedBy<ShellImpl>())
次ã«ãã·ã§ã«ã®èµ·åæã«ã¢ãžã¥ãŒã«ãããŒãããå¿ èŠããããŸãã ãããŠã圌ãã¯ã©ãããæ¥ãã®ã§ããããïŒ ãã®äŸã§ã¯ãã·ã§ã«ã¯Shell.exeã®é£ã«ã¢ãžã¥ãŒã«ãæã€ã¢ã»ã³ããªãæ¢ããŸãã
ãã®æ©èœã¯ãOnStartupã¡ãœããã§å®è£ ããå¿ èŠããããŸãã
protected override void OnStartup(object sender, StartupEventArgs e) { var loader = _container.Resolve<ModuleLoader>(); var exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var pattern = "*.dll"; Directory .GetFiles(exeDir, pattern) .Select(Assembly.LoadFrom) .Select(loader.LoadModule) .Where(module => module != null) .ForEach(module => module.Init()); DisplayRootViewFor<ShellViewModel>(); }
ãã¹ãŠãã·ã§ã«ã®æºåãã§ããŸããïŒ
ã¢ãžã¥ãŒã«ãæžã
ããŒãæã®ãã¹ãã¢ãžã¥ãŒã«ã¯ãã·ã§ã«ã¡ãã¥ãŒã«2ã€ã®ã¢ã€ãã ãè¿œå ããŸãã æåã®ã¢ã€ãã ã¯ãç¢æã®ããéåžžã«ã·ã³ãã«ãªãã©ãŒã ãå³åŽã«è¡šç€ºããŸãã 2çªç®ã®ãã¿ã³ã¯ãã¿ã³ã®ãããã©ãŒã ã§ãéãããã¡ã€ã«éžæãã€ã¢ãã°ã§ã¢ãžã¥ãŒã«ãéžæããŠã¢ãžã¥ãŒã«ãããŒãã§ããŸãã åœåèŠåã«åŸã£ãŠã2ã€ã®ãã¥ãŒãšViewModelsãã©ã«ããŒãäœæããŸãã ãã®åŸãããããåããŸãã
æåã®ãã¥ãŒãšãã¥ãŒã¢ãã«ã¯ç°¡åã§ãã
<UserControl x:Class="Module.Views.FirstView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="60">Hello, I'm first !</TextBlock> </Grid> </UserControl>
class FirstViewModel { }
2çªç®ã®ãã¥ãŒãé£ãããããŸããã
<UserControl x:Class="Module.Views.SecondView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <Button x:Name="Load" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="50">Load Module</Button> </Grid> </UserControl>
2çªç®ã®ãã¥ãŒã¢ãã«ã§ã¯ãéžæããã¢ãžã¥ãŒã«ãããŒãããŸãã
class SecondViewModel { private readonly IShell _shell; public SecondViewModel(IShell shell) { _shell = shell; } public void Load() { var dlg = new OpenFileDialog (); if (dlg.ShowDialog().GetValueOrDefault()) { var asm = Assembly.LoadFrom(dlg.FileName); var module = _shell.LoadModule(asm); if(module!=null) module.Init(); } } }
IModuleã³ã³ãã©ã¯ããå®è£ ããŸãã Initã¡ãœããã§ãã¢ã€ãã ãã·ã§ã«ã¡ãã¥ãŒã«è¿œå ããŸãã
class ModuleImpl : IModule { private readonly IShell _shell; private readonly FirstViewModel _firstViewModel; private readonly SecondViewModel _secondViewModel; public ModuleImpl(IShell shell, FirstViewModel firstViewModel, SecondViewModel secondViewModel) { _shell = shell; _firstViewModel = firstViewModel; _secondViewModel = secondViewModel; } public void Init() { _shell.MenuItems.Add(new ShellMenuItem() { Caption = "First", ScreenViewModel = _firstViewModel }); _shell.MenuItems.Add(new ShellMenuItem() { Caption = "Second", ScreenViewModel = _secondViewModel }); } }
ãããŠæåŸã®ä»äžãã¯ã€ã³ã¹ããŒã©ãŒã§ãã
public class ModuleInstaller:IWindsorInstaller { public void Install(IWindsorContainer container, IConfigurationStore store) { container .Register(Component.For<FirstViewModel>()) .Register(Component.For<SecondViewModel>()) .Register(Component.For<IModule>().ImplementedBy<ModuleImpl>()); } }
ã§ããïŒ
ãœãŒã¹-gitãã ã
ãããã«
ãã®èšäºã§ã¯ãCastle.Windwsorããã³Caliburn.Microãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãæãåçŽãªã¢ãžã¥ã©ãŒWPFã¢ããªã±ãŒã·ã§ã³ãäœæããããšãæ€èšããŸããã ãã¡ãããå€ãã®åŽé¢ãã«ããŒãããŠããªãã£ããããã€ãã®è©³çŽ°ãçç¥ãããŠããããªã©ãããã§ãªããã°æ¬ã¯å€æããããã§ã¯ãªãã£ãã§ãããã ããã«è©³çŽ°ãªæ å ±ã¯ãå ¬åŒãªãœãŒã¹ã ãã§ãªããèŠã€ããããšãã§ããŸãã
ãã¹ãŠã®è³ªåã«åãã§ãçãããŸãã
ãæž èŽããããšãããããŸããïŒ