【问题标题】:Generic ServiceLocator GetInstance通用服务定位器 GetInstance
【发布时间】:2023-03-12 02:16:01
【问题描述】:

我正在使用 Microsoft.Practices.ServiceLocation 程序集来创建 ServiceLocator。

我也在使用

模拟 ServiceLocator
var mockS = new Mock<IServiceLocator>();

这个模拟应该返回实际的服务定位器,所以代码就像

mockS.Setup(x => x.GetInstance<ISettings>()).Returns(ServiceLocator.Current.GetInstance<ISettings>());
mockS.Setup(x => x.GetInstance<IContext>()).Returns(ServiceLocator.Current.GetInstance<IContext>());
mockS.Setup(x => x.GetInstance<IXYZ>()).Returns(ServiceLocator.Current.GetInstance<IXYZ>());

我想为此创建一个通用语句,例如

mockS.Setup(x => x.GetInstance<It.IsAny<T>()>()).Returns(ServiceLocator.Current.GetInstance<T>());   

但是我没有让它工作。任何帮助将不胜感激。

【问题讨论】:

    标签: c# moq service-locator


    【解决方案1】:

    由于是静态实例,需要先设置:

    var mockS = new Mock<IServiceLocator>();
    ServiceLocator.SetLocatorProvider(() => mockS.Object);
    

    然后您可以在模拟实例上编写设置:

    mockS.Setup(x => x.GetInstance<ISettings>()).Returns(settingsMock);
    

    您不能在类型参数上使用It.IsAny 方法。

    【讨论】:

      【解决方案2】:

      你需要一个泛型方法:

      void SetupGetInstance<T>(Mock<IServiceLocator> mock) 
      {
         mock.Setup(x => x.GetInstance<T>()).Returns(ServiceLocator.Current.GetInstance<T>());   
      }
      

      并为您希望进行此类设置的 IoC 中的每个组件调用它。但是,如果在所有情况下你都只是通过ServiceLocator.Current.GetInstance&lt;T&gt;() 获得一个实例,你为什么要首先模拟它?

      【讨论】:

      • 在某些情况下我想返回模拟对象,其余情况下我想通过 ServiceLocator.Current.GetInstance()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2010-11-28
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多