【问题标题】:How to persist a single business object with MVVM-Light SimpleIoc如何使用 MVVM-Light SimpleIoc 持久化单个业务对象
【发布时间】:2014-02-22 18:02:09
【问题描述】:

我有一个复杂的业务对象,它是在用户登录时创建的,并且需要在应用程序的大多数视图模型中保留它。我能做的就是每次创建一个新的视图模型时用信使发送它,这是可行的,但是它的代码太多,每次都是一样的,我相信这不是一种正确的做事方式。 我在 Windows 窗体中所做的 - 我让所有窗体都继承自一个基类,该基类将此业务对象作为成员,并包含在构造函数中。 我相信,SimpleIoc 可以用来解决这个问题。好吧,这里how to use MVVMLight SimpleIoc? 我发现了一个迹象,表明可以注册一个具体的对象(但对于接口 - 为什么?)。 那么,有没有办法在应用程序的整个生命周期中将对象存储在容器中?如果这很重要,它在构造函数中有参数。

【问题讨论】:

标签: c# wpf mvvm inversion-of-control mvvm-light


【解决方案1】:

正如linked 教程中所述

2) 默认情况下,每个对象都是单例。要解析对象使其不是单例,您需要将唯一值传递给 GetInstance 调用:

SimpleIoc.Default.GetInstance<MainViewModel>(Guid.NewGuid().ToString());

所以每次你什么都不传递(或总是相同的值)到GetInstance的调用时得到相同的实例

[Test]
public void CreateNonGeneric_ReturnsSameInstance1()
{
    SimpleIoc.Default.Register<Repository>();

    var result1 = SimpleIoc.Default.GetInstance<Repository>();
    var result2 = SimpleIoc.Default.GetInstance<Repository>();

    Assert.That(result1, Is.SameAs(result2));
}

[Test]
public void CreateNonGeneric_ReturnsSameInstance2()
{
    SimpleIoc.Default.Register<IRepository, Repository>();

    var result1 = SimpleIoc.Default.GetInstance<IRepository>();
    var result2 = SimpleIoc.Default.GetInstance<IRepository>();

    Assert.That(result1, Is.SameAs(result2));
}

[Test]
public void CreateNonGeneric_ReturnsSameInstance3()
{
    SimpleIoc.Default.Register<Repository>();

    var result1 = SimpleIoc.Default.GetInstance<Repository>("alwaysthesame");
    var result2 = SimpleIoc.Default.GetInstance<Repository>("alwaysthesame");

    Assert.That(result1, Is.SameAs(result2));
}

更新

您可以在注册期间配置依赖项。这是一个带字符串的

[Test]
public void RegisterSingletonWithFunc_GetIstance_ReturnsSameInstanceEachTime()
{
    SimpleIoc.Default.Register<IRepository, Repository>();
    SimpleIoc.Default.Register<Repository>(() => 
        new Repository("dependency"), "single");
    var result1 = SimpleIoc.Default.GetInstance<IRepository>("single");
    var result2 = SimpleIoc.Default.GetInstance<IRepository>("single");

    Assert.That(result1, Is.SameAs(result2));
}

这是一个由 SimpleIoc 创建的依赖项

[Test]
public void RegisterSingletonWithDependentClass_GetIstance_ReturnsSame()
{
    SimpleIoc.Default.Register<IRepository, Repository>();
    SimpleIoc.Default.Register<SomeService>();
    SimpleIoc.Default.Register<Repository>(() => 
        new Repository(
            SimpleIoc.Default.GetInstance<SomeService>())
            , "single");
    var result1 = SimpleIoc.Default.GetInstance<IRepository>("single");
    var result2 = SimpleIoc.Default.GetInstance<IRepository>("single");

    Assert.That(result1, Is.SameAs(result2));
}

【讨论】:

  • 要构建业务对象,我不能使用默认的无参数构造函数,我需要传递某些值,在某些情况下是复杂的业务对象本身。因此,我不能只为容器注册一个类名。它必须是我的对象,或者我需要在类注册中以某种方式传递参数。
  • 谢谢!您的更新帮助我实现了我想要的!
猜你喜欢
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多