【问题标题】:can ServiceLocator.Current.GetInstance return null?ServiceLocator.Current.GetInstance 可以返回 null 吗?
【发布时间】:2012-07-06 09:41:31
【问题描述】:

在我们的许多观点中,我都有这段代码(或类似的):

private IEventAggregator eventAggregator;

Constructor()
{
    eventAggregator = ServiceLocator.Current.GetInstance<IEventAggregator>();
    ...
}

我从this 帖子中读到,ServiceLocator.Current 可以抛出 NullReferenceException(构造函数上的坏事),但我想知道 GetInstance() 方法是否可以返回 null(或其他一些不一致的对象),从而使 eventAggregator 对稍后在其他方法中使用。

注意:我对 MVVM 和 WPF 很陌生

【问题讨论】:

  • 从技术上讲,如果 ServiceLocator.Current 为 Null,您将无法调用 .GetInstance() 方法,因为您将收到 Object not set to an instance of an object 异常。
  • 在获得一些经验后,在单元测试中调用代码时可能会发生 ServiceLocator.Current 可以为 null 的情况。在这种情况下,服务定位器可能尚未初始化(即可能未调用负责它的代码)。一种解决方法是模拟它(我使用了 MOQ 库),但只是为了测试存在服务定位器但我们对此不感兴趣的特定代码。

标签: c# wpf mvvm nullreferenceexception service-locator


【解决方案1】:

如果服务定位器为空,则可能存在未正确设置统一的东西。在正常情况下,恕我直言,这应该不是问题。

话虽如此,我倾向于使用稍微不同的方式来访问服务定位器。

例如,如果我有一个名为 MyClass 的类,我将使用统一依赖注入将服务定位器传入(也称为统一中的容器)。而且我倾向于使用unity的Resolve功能而不是GetInstance,但是它们是一样的。

也有人说服务定位器是一种反模式,但我不认同这种想法。 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

例子

public MyClass(IUnityContainer container)
{
    var ea = container.Resolve<IEventAggregator>();
}

【讨论】:

    猜你喜欢
    • 2016-10-17
    • 2010-11-10
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多