【问题标题】:Prism and Unity - prevent auto creation of typePrism 和 Unity - 防止自动创建类型
【发布时间】:2012-02-17 20:27:37
【问题描述】:

我正在创建一个使用 Prism 和 Unity 作为容器的 WPF 应用程序。有几次我对注册类型的顺序感到困惑,当我没有注册类型时,Unity 会自动创建一个类型(ViewModel 到 View 构造函数)。然后我尝试使用 ContainerControlledLifetimeManager() 注册类型,并且 以为 我创建了一个单例。然而,自动创建意味着视图模型的多个实例。

除了不是木偶而不做上述事情的明显解决方案之外,有没有办法阻止 Unity 自动创建未注册的类型并可能引发异常?

【问题讨论】:

    标签: unity-container prism


    【解决方案1】:

    为每个 ViewModel 定义一个接口,然后相应地注册它们。

    public interface IViewModel
    {
         List<IUser> Users { get; }
    }
    
    public class ViewModel : IViewModel
    {
         List<IUser> Users { get; }
    }
    
    Container.RegisterType<IViewModel, ViewModel>();
    

    在你的构造函数中确保注入的是接口类型,而不是具体类型,因为 Unity 肯定会构造一个具体类型的实例,因为它是可解析的;而一个接口可以有 N 个实现。

    此外,您的代码应该构建为需要跨应用程序存在的数据应该来自服务,而不是 ViewModel。让您的 ViewModel 成为单例不应该是您的方法,而是通过服务代理数据。这样您的 ViewModel 可以随意构建/销毁,您想要持久化的数据存在于别处。

    Container.RegisterType<IService, Service>(new ContainerControlledLifetimeManager());
    Container.RegisterType<IViewModel, ViewModel>();
    
    ...
    
    public List<IUser> Users
    {
         get { return Container.Resolve<IService>().GetUsers(); }
    }
    

    【讨论】:

    • 感谢您的快速回复。我通常不会费心为视图模型创建接口,因为我看不到重点,因为它们与它们提供数据上下文的视图相关联。我已经看到了一些优点和缺点,但对我来说它有点矫枉过正。也许我需要重新考虑这一点。所以没有配置选项?
    • 如果你注册了一个给定的类型;它默认为瞬态生命周期。使用ContainerControlledLifetimeManager 肯定会提供单例行为,但是您通常不希望使用 ViewModel 这样做。请记住,ViewModel 可以跨多个视图使用。此外,它还允许您以相当简单的方式交换具体类型以进行测试或其他方式。我知道,创建具体类型实例的 Unity 是不可配置的,这是容器的行为。单例示例应该可以工作,需要代码来理解您的示例。
    • Container.Resolve() 是一种可怕的做法!通过服务代理数据是很好的建议!
    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多