如何在模块化应用程序中连接数据上下文?

时间:2012-11-12 16:44:23

标签: mvvm datacontext

我正在使用PRISM编写一个WPF应用程序。如果这个问题形式不好,我很新,所以道歉:

我有一个模块,到目前为止还有一个用户控件,用于显示检查列表。我的模块具有写入的实体和用于访问DB的DbContext类。我的问题是它应该在哪里被初始化并传递到我的ViewModel ???????

Shell 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>

Bootstrapper类

   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));
        }
    }
}

1 个答案:

答案 0 :(得分:3)

如果您正在使用Unity,那么您很幸运。如果你需要它初始化你的数据库上下文,那么你可以做这样的事情:

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);
    }
    }

以上内容将注册您的所有视图,viewmodel和dbcontext,解决它们并将它们添加到区域中。为了实现上述目标,我期待以下内容:

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

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

基本上,我希望你的viewmodel被注入你的View和你的数据库上下文,以便使用Constructor Injection注入你的ViewModel。

BTW - 代码中的链接转到MS站点,这些站点将提供有关模块创建和区域的更多背景信息。我有一个最后的链接:这是一个“Hello World”Prism应用程序。这是针对Silverlight的,但就代码结构而言,这与WPF应用基本相同,所以应该是有用的:Prism Hello World