【问题标题】:Mvvm light SimpleIoC in usercontrol用户控件中的 Mvvm light SimpleIoC
【发布时间】:2019-04-22 19:52:49
【问题描述】:

我希望有人能对我的用例的最佳实践有所启发。

我在 wpf 用户控件中使用 mvvm light 和 simpleIoC 容器。我向它注册了我的模型和视图模型、数据服务和设计时服务(非常根据 mvvm light 示例代码)

我看到的 SimpleIoC 容器使用示例似乎总是将容器视为 GalaSoft 命名空间的静态/全局。

但是,如果我要在同一个应用程序中创建我的 WPF 控件的两个实例,我当然希望每个用户控件都有自己的一组 VM 和模型实例。所以基本上是它自己的一组 SimpleIoC 注册实例。当默认 IoC 容器似乎是静态对象时,我如何才能最好地实现这一点?

【问题讨论】:

    标签: wpf user-controls mvvm-light simpleioc


    【解决方案1】:

    当您获取实例时,您可以选择提供一个密钥。尽管默认情况下每个类型都有一个单例,但这会为每个键生成该类型的另一个缓存版本。这意味着您可以使用 guid 或其他东西作为您需要的每个实例的密钥。

    但是有一个潜在的问题。如果您获得 100 个不同版本的实例,那么它们在您的应用程序的整个生命周期中都在内存中。

    如果这只是几个实例,你可能没问题。

    更多,您可能最好使用更复杂的 di 容器。 SimpleIoC 仅适用于简单的用例。

    但是,您可以在获取实例时使用工厂方法。这不合我的口味,但如果您真的想使用 simpleioc,那么可以考虑。

    您可以在此处阅读更多来自 laurent bugnion 的内容。

    https://msdn.microsoft.com/en-us/magazine/jj991965.aspx

    【讨论】:

    • 谢谢这解释得很好。所以 Mark Feldman 关于使用工厂模式的回答只是提供一个 Guid 或类似的并为该 Guid 生成一个实例。因此,如果我使用工厂方法,该方法本身就必须保留缓存的实例?似乎有很多“应该”简单的代码。
    • 我认为他建议使用工厂而不是 di 容器。是的。您似乎想要做的是使用更复杂的 di 容器更容易。简单只有在足够的情况下才是好的。
    • 问题的答案只是创建一个单独的 SimpleIoC 实例。这解决了我的问题,因为 VMLocator 也不是单例。但我赞成这篇文章,因为它提供了更多有用的细节。谢谢!
    【解决方案2】:

    这就是工厂模式旨在解决的问题,您创建一个创建控制视图模型的类,然后注入它。

    更好的关注点分离。

    【讨论】:

    • 谢谢,你能提供一些例子或参考吗?我用谷歌搜索了工厂模式,但我没有看到我如何使用它,以便两个用户控件获得自己的一组 VM 实例,并且他们在使用 GetInstance(vmKeyString) 时获得正确的实例?
    【解决方案3】:

    当默认的 IoC 容器似乎是一个静态对象时,我如何才能最好地做到这一点?

    不要使用默认容器,而是创建您自己的 SimpleIoc 类实例:

    用户控制 A:

    SimpleIoc containerA = new SimpleIoc();
    containerA.Register<ViewModel>();
    ...
    ViewModel vm = containerA.GetInstance<ViewModel46>();
    

    用户控件 B:

    SimpleIoc containerB = new SimpleIoc();
    ...
    

    【讨论】:

    • 是的,这部分有效。基本上我确实可以在 viewmodellocator 中创建一个新的容器实例并将虚拟机注册到它。但是那我如何让构造函数依赖注入工作呢?
    • @Johan。这取决于。目前如何运作。你的用户控件在哪里适合这个?一旦您的原始问题得到解答,请不要在 cmets 字段中提出其他问题。
    • 这可能行得通,但从“纯粹”的 IoC 角度来看,它看起来不是很好。我的意思是,为每个用户控件创建一个新容器?我确实明白,SimpleIoc 中可能没有更好的方法(工厂、生命周期范围)。
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    相关资源
    最近更新 更多