1

アプリケーション全体で使用されるオブジェクトがあり、一部の ViewModel で変更できます。にオブジェクトを登録するにはどうすればよいAppBootstrapperですか?

次のコードを検討してください。

AppBootstrapper

protected override void Configure()
{
    this.container = new PhoneContainer(RootFrame);
    this.container.RegisterPhoneServices();

    var myObject = this.CreateDefaultObject();
    this.container.Instance(myObject);

    // ... etc.
}

private MyObject CreateDefaultObject()
{
    // blah blah blah

    return new MyObject {
        Status = "New"
    };
}

ViewModel1

public ViewModel1(MyObject myObject, INavigationService navigationService)
{
    this.myObject = myObject;
    this.navigationService = navigationService;
}

public string Status
{
    get { return this.myObject.Status; }
}

ViewModel2

public ViewModel2(MyObject myObject, INavigationService navigationService)
{
    this.myObject = myObject;
    this.navigationService = navigationService;
}

public ModifyIt()
{
    this.myObject = new MyObject {
        Status = "Modified"
    };

    this.navigationService.GoBack();
}

シナリオは次のとおりです。

  1. アプリケーションが実行され、View1 に移動します。TextBlock
  2. ユーザーは View2 に移動し、アクションModifyIt(Buttonクリックなど)を実行します。
  3. アプリケーションは View1 に戻り、今度は表示される値が「変更済み」である必要があります。

どんな助けにも感謝します。

4

1 に答える 1

1

実際の答え:

これについて考えると、それは決して機能しません。その理由は、コンテナー インスタンスを受け取るローカル変数があるためです。このインスタンスを 2 番目の ViewModel に置いていません。実際にはローカル インスタンスをオーバーライドしているため、コンテナ インスタンスは参照されません。したがって、コードを元の実装と同様に維持したい場合は、上記のようにしてプロパティ値を交換することをお勧めします。

インスタンスは、リクエストされるたびに同じ「インスタンス」を返します。これを新しいインスタンスとして設定すると、リクエストされるたびにセットが上書きされます。

代わりにシングルトンとして登録してください。

container.Singleton<MyObject>();

これにより、インスタンスを変更できます。オブジェクトを事前に作成する必要がある場合のもう1つのオプションは、オブジェクトの構築をcontainer.Instance呼び出しの外に移動することです。

 var myObject = new MyObject("new");
 container.Instance(myObject);

それはあなたのために働くでしょう

ちなみに、両方の違いは、シングルトンは最初のリクエストまでインスタンス化されないことです。インスタンスは通常、サービス宣言時にインスタンス化されます。現在、SimpleContainer のドキュメントを完成させており、来週から利用できるようになります。

編集:

したがって、以下のテストからわかるように、これは機能しないことがわかります。最後のアサートは失敗します。これが仕様によるものかどうかはわかりませんので、チームと話し合う必要があります。

    [Fact]
    public void GetInstance_returns_the_latest_updated_instance() {
        var instanceA = new object();
        var instanceB = new object();

        var container = new SimpleContainer();
        container.RegisterInstance(typeof(object), "A", instanceA);

        Assert.False(instanceA == instanceB);
        var returnedInstance = container.GetInstance(typeof (object), "A");
        Assert.True(instanceA == returnedInstance);

        returnedInstance = instanceB;
        var finalInstance = container.GetInstance(typeof (object), "A");
        Assert.True(returnedInstance == finalInstance);
    }

この時点で、私の提案は、あなたの課題を 1 つ下げることです。つまり、あなたMyObjectは別のオブジェクトのプロパティになるということです。そうすれば、プロパティを自由に交換できます。インスタンスは変更されないため、意図したとおりに動作するはずです。これが私がそれを行う方法であり、それが私が最初の仮定を立てた理由です。私は、他のアプリケーション レベルのサービスをいくつかラップする傾向があるため、コンストラクターが非常に長くなりません。

于 2013-06-07T11:08:22.983 に答える