0

私のシェル ウィンドウには、RequestNavigate によるビューの切り替えを可能にするワークスペース領域があります。ビューの初期化が次のようになるように、View-First アプローチで Unity を使用しています。

public partial class WelcomeView : UserControl
{
    public WelcomeView(WelcomeViewModel vm)
    {
        InitializeComponent();
        this.DataContext = vm;
    }
}

アプリケーションが読み込まれたら、BootStrappers の InitializeShell が次のように見えるように、既定のビューに移動したいと考えています。

protected override void InitializeShell()
{
    Application.Current.MainWindow = (Window)Shell;
    Application.Current.MainWindow.Show();

    var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
    regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
}

ここで、私のデフォルト ビューである WelcomeView では、WelcomeViewModel をコンストラクターに挿入する必要があり、WelcomeViewModel のコンストラクターにいくつかのサービスを挿入する必要があります。

public class WelcomeViewModel : INotifyPropertyChanged
{
    public WelcomeViewModel(ISomeService someService)
    {
         // Use some service
         someService.SomeEventOccured += new Action(someService_SomeEventOccured);
    }

    ...
}

問題は、ISomeService がモジュールによって提供される場合です。モジュールは InitializeShell が呼び出された時点で初期化されていないため、WelcomeViewModel を構築できず、WelcomeView も構築できません。

これを行う適切な方法は何ですか?

4

2 に答える 2

2

これを行う適切な方法は、モジュールの依存関係を使用することです

したがって、依存関係を持つモジュールには次のものが含まれます

[ModuleDependency("SomeModule")] 
[ModuleDependency("SomeOtherModule")] 
public class MyModule : IModule { } 

そして、それが依存するモジュールには以下が含まれます。

[Module(ModuleName = "SomeModule")] 
public class MyOtherModule: IModule 

また、ここにあるように「マジックストリング」を使用せず、代わりに、すべてのモジュールの名前を含む静的クラスを共通/インフラストラクチャプロジェクトに含めることも理にかなっています。

これにより、プリズムがモジュールを正しい順序でロードできるようになり、依存関係が常に解決されます。

于 2012-06-26T14:22:05.050 に答える
1

ナビゲートを要求する部分を後の瞬間に移動するだけです。ブートストラップが呼び出され、それを要約する特定の順序があります。

  1. CreateShell メソッドが呼び出されます
  2. InitializeShell メソッドが呼び出されます
  3. InitializeModules メソッドが呼び出されます。

    protected override void InitializeModules()
    {
        base.InitializeModules();
    
        var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
        regionManager.RequestNavigate("MainWorkspaceRegion", "WelcomeView");
    }
    

モジュール依存関係の作成は機能しません。モジュールに依存するビューに移動しようとしてもモジュールが読み込まれないためです。また、なぜ Service locator を使用しているのですか? ブートストラップで作業しているため、コンテナーに直接アクセスできる場合。完全なロード順序はここにあります

于 2012-06-26T20:07:09.713 に答える