17

私は、将来的に拡張可能で保守可能な中規模の WPF アプリケーション (MVVM) に取り組んでいます。そこで、柔軟性を保つために IoC コンテナー (この場合は Unity) を使用することにしました。

ただし、Unity を WPF アプリケーションのどこに配置して構成すればよいかわかりません。

コンテナーはグローバルにアクセスできるはずなので、おそらく Application クラスに移動する必要があると思います。しかし、静的プロパティにする必要がありますか? Application_Startup() イベント ハンドラーで構成する必要がありますか?

例えば:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    public static UnityContainer MyUnityContainer;


    private void Application_Startup(object sender, StartupEventArgs e)
    {
        // instantiate and configure Unity
    }
}

このようにして、静的プロパティを介してアプリケーションの任意の場所からコンテナーにアクセスできます。

App.MyUnityContainer

これは 1 つの方法だと思いますが、この問題、特に WPF アプリのより良い方法があるかどうかはわかりません。

4

3 に答える 3

8

構成ルート パターンを見てください。あなたがしたいことは、Startup イベント ハンドラーでそれを初期化し、アプリケーションの残りの部分の存在を忘れることです。

Service Locator Patternを実装しようとしていますが、これは多くの人によると、この問題に対する劣った解決策です。

于 2012-04-30T06:58:23.463 に答える
7

私が結論付けたことを投稿させてください。うまくいけば、それが人々の助けになることを願っています。間違っていたら訂正!:P

私たちは次のようなことを調べていると思います:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        UnityContainer myUnityContainer = new UnityContainer();
        //make sure your container is configured
        myUnityContainer.RegisterType<ISomeDependency, SomeDependencyImplementation>();
        myUnityContainer.RegisterType<IMainWindow, MainWindow>();

        myUnityContainer.Resolve<IMainWindow>().Show();
    }
}

public partial class MainWindow : Window, IMainWindow
{
    private ISomeDependency _someDependency;

    public MainWindow(ISomeDependency someDependency)
    {
        _someDependency = someDependency;
    }
}

グローバルまたはシングルトンがないことに注意してください。コンテナーは MainWindow が存続する限り存続し、このエントリ ポイントの背後にある構成グラフのすべての依存関係は、コンテナーが認識している限り、自動的に解決されます。

于 2012-10-16T12:17:44.730 に答える