Generic ServiceLocator GetInstance

本文关键字:GetInstance ServiceLocator Generic | 更新日期: 2023-09-27 18:04:49

我正在使用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>());   

然而我没有得到它的工作。

Generic ServiceLocator GetInstance

由于它是一个静态实例,您需要先设置它:

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

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

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

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

您需要一个泛型方法:

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

并为您希望这样设置的IoC中的每个组件调用它。但是,如果在所有情况下都只是通过ServiceLocator.Current.GetInstance<T>()获得一个实例,那么为什么首先要嘲笑它呢?