1

我有一个在整个应用程序中使用的对象,它可以被一些 ViewModel 修改;我应该如何注册对象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"
    };
}

视图模型1

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

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

视图模型2

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,这次显示的值应该是“Modified”

感谢任何帮助。

4

1 回答 1

1

实际答案:

考虑到这一点,它永远不会起作用,原因是你有你的局部变量来获取容器实例。你没有在你的第二个 ViewModel 中休息这个实例,你实际上是在覆盖本地实例,以便不再引用容器实例。所以我的最终建议是按照上面的方法换出一个属性值,如果你想让代码与你的原始实现相似。

您在正确的路径上,每次请求时,实例都会向您返回相同的“实例”,因为您将其设置为新实例,每次请求时它都会覆盖您的设置。

而是注册为单身人士。

container.Singleton<MyObject>();

这将允许您修改实例。如果您需要预先创建对象,另一种选择是将对象的构造移到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);
    }

在这一点上,我的建议是将你的任务推低一个。我的意思是你MyObject成为另一个对象的属性。这样你就可以自由地换出财产。由于实例永远不会改变,它应该按预期工作。这就是我会这样做的原因,这就是我做出最初假设的原因。我倾向于有几个应用程序级服务来包装其他服务,因此我的构造函数不会变得愚蠢地长。

于 2013-06-07T11:08:22.983 回答