1

Unity フレームワークのドキュメントを読んで混乱しました。 リンク

一部のデバイスを検索する WPF アプリケーションを作成しています。
私のメインウィンドウからの私のコードの下。ご覧のとおり、メイン ウィンドウ内でまだ UnitOfWork と DeviceService を宣言しています。このコードを依存性注入を適用して置き換えたいと考えています。同時に、メイン ウィンドウ内にビューモデルも挿入します。

 public Window1()
    {
        InitializeComponent();

        UnitOfWork myUnitOfWork = new UnitOfWork();
        DeviceService dService = new DeviceService(myUnitOfWork);

        _vm = new DeviceViewModel(dService);
        this.DataContext = _vm;

        _vm.SearchAll();            
    }

以下のコードで試してみましたが、コンテナの設定に失敗しました。本当の質問は、どのように始めればよいですか? プログラムの構造を完全に変更する必要がありますか?

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        IUnityContainer container = new UnityContainer();

        UnitOfWork myUnitOfWork = new UnitOfWork();
        container.RegisterInstance<UnitOfWork>(myUnitOfWork);

        Window1 w1 = new Window1();
        w1.Show();
    }
}

提案されたチュートリアルを実行しました。プロパティ インジェクションをどのように構成する必要があるかは、まだ明確ではありません。

ビューモデルは Window 1 クラスに挿入する必要があるため、依存関係プロパティを作成する必要があると想定しています。

 private DeviceViewModel viewModel;

    [Dependency]
    public DeviceViewModel ViewModel
    {
        get { return viewModel; }
        set { this.DataContext = value; }
    }

DeviceViewModel が DeviceService と UnitOfWork に依存していることを知って、ビューモデルをウィンドウ 1 に挿入するにはどうすればよいですか?

//CONSTRUCTOR
    public DeviceViewModel(DeviceService service)
    {  
        Service = service;
        SearchCommand = new SearchCommand(this);
    }

private UnitOfWork myUnit;

    public DeviceService(UnitOfWork unit)
    {
        myUnit = unit;
    }
4

2 に答える 2

2

他のオブジェクトが必要とするすべてのオブジェクトを構築する方法をコンテナに伝える必要があります。その後、コンテナは必要なときに必要なものをインスタンス化します。

プロパティの注入には 1 行しかありません。

private DeviceViewModel viewModel;

[Dependency]
public DeviceViewModel ViewModel
{
    get { return viewModel; }
    set { viewModel = value; this.DataContext = viewModel; }
} 

次に、あなたに OnStartup()

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    IUnityContainer container = new UnityContainer();

    container.RegisterType<UnitOfWork>();
    container.RegisterType<DeviceService>();
    container.RegisterType<DeviceViewModel>();

    Window1 w1 = container.Resolve<Window1>();
    w1.Show();       
}

RegisterType() で使用できるさまざまなパラメーターがあるため、オブジェクトの有効期間と作成を制御できます。

于 2013-01-07T16:19:27.593 に答える
0

この例を実行する必要があります: http://visualstudiogallery.msdn.microsoft.com/3ab5f02f-0c54-453c-b437-8e8d57eb9942

あなたは正しい軌道に乗っています。ウィンドウを新しくするのではなく、ウィンドウを解決する必要があります。

//instead of Window1 w1 = new Window1();
Window1 w1 = container.Resolve<Window1>();
w1.DataContext = container.Resolve<DeviceViewModel>();

Window1独自に設定する必要がなくなりますDataContext

于 2013-01-06T18:58:57.623 に答える