1

PRISM を使用してアプリケーション WPF を作成しています。私は新しいので、この質問が悪い形式である場合はお詫びします:

これまでに、検査のリストを表示するためのユーザー コントロールを備えたモジュールがあります。私のモジュールには、エンティティが記述されており、DB にアクセスするための DbContext クラスがあります。私の質問は、これをどこで初期化し、ViewModel に渡す必要があるかということです???????

シェル XAML

<Window x:Class="ChargeMgm.Desktop.Shell"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://www.codeplex.com/prism"
        Title="EMS" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition MinHeight="100"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontFamily="Calibri"
                   FontSize="16"
                   Foreground="SteelBlue"
                   Margin="5">Street Works Modules</TextBlock>
        <Border BorderThickness="1" BorderBrush="SteelBlue" CornerRadius="3" Grid.Row="1" Margin="5">
        <ItemsControl prism:RegionManager.RegionName="MainRegion"
                      VerticalContentAlignment="Stretch"
                      HorizontalContentAlignment="Stretch"/>
        </Border>
    </Grid>


</Window>

ブートストラップ クラス

   class Bootstrapper : UnityBootstrapper
    {
        protected override System.Windows.DependencyObject CreateShell()
        {
            return new Shell();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();

            App.Current.MainWindow = (Window)this.Shell;
            App.Current.MainWindow.Show();
        }

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();
            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(DefectModule.DefectModule));
        }
    }

モジュール

public class DefectModule : IModule
{
    private readonly IRegionManager regionManager;
    private IUnityContainer container;

    public DefectModule(IUnityContainer container, IRegionManager regionManager)
    {
        this.regionManager = regionManager;
        this.container = container;
    }

    public void Initialize()
    {
        container.RegisterType<IDefectsView, DefectsView>();
        container.RegisterType<IDefectsViewModel, DefectsViewModel>();
        container.RegisterType<IDefectContext, DefectContext>();
        var view = container.Resolve<IDefectsView>();
        if(regionManager.Regions.ContainsRegionWithName("MainRegion"))
        {
            regionManager.Regions["MainRegion"].Add(view);
            //regionManager.RegisterViewWithRegion("MainRegion", typeof(IDefectsView));
        }
    }
}
4

1 に答える 1

3

Unity を使用している場合は、幸運です。DB コンテキストを初期化する必要がある場合は、次のようなことができます。

IModule 実装コード (モジュール用)

   // Create Module http://msdn.microsoft.com/en-us/library/ff648781.aspx
    public class Module:IModule
    {
    private IUnityContainer _container;
    public Module(IUnityContainer container,IRegionManager regionManager)
    {
    _regionManager=regionManager;
    _container=container;
    }
    public Initialize()
    {
        _container.RegisterType<IView,View>();
        _container.RegisterType<IViewModel,ViewModel>();
        _container.RegisterType<IDBContext,DbContext>();
        var view=_container.Resolve<IView>();
        //Create Region http://msdn.microsoft.com/en-us/library/ff648829.aspx
        _regionManager.Regions["MainRegion"].Add(view);
    }
    }

上記は、すべてのビュー、ビューモデル、および dbcontext を登録し、それらを解決してリージョンに追加します。上記が機能するためには、次のことを期待しています。

public class View:IView
{
    public View(IViewModel viewModel)
    {
    }
}

public class ViewModel:IViewModel
{
    public ViewModel(IDbContext context)
    {
    }
}

基本的に、ViewModel が View に注入され、DB Context がConstructor Injectionを使用して ViewModel に注入されることを期待しています。

ところで-コード内のリンクは、モジュールの作成とリージョンの詳細な背景を提供する MS サイトに移動します。最後のリンクが 1 つあります。これは「Hello World」Prism アプリです。これは Silverlight 用ですが、これはコード構造に関しては基本的に WPF アプリと同じであるため、役立つはずです: Prism Hello World

于 2012-11-12T17:34:09.633 に答える