Generic ServiceLocator GetInstance
本文关键字:GetInstance ServiceLocator Generic | 更新日期: 2023-09-27 18:04:49
我正在使用Microsoft.Practices.ServiceLocation程序集来创建ServiceLocator。
我还使用
模拟ServiceLocatorvar 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>());
然而我没有得到它的工作。
由于它是一个静态实例,您需要先设置它:
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>()
获得一个实例,那么为什么首先要嘲笑它呢?