ServiceLocator通过传递构造参数获得实例

本文关键字:参数 实例 ServiceLocator | 更新日期: 2023-09-27 17:54:34

如何使用下面的构造函数获得具有服务定位器的对象实例。ProductCode是用于初始化成员属性的构造函数参数。对于所有其他构造函数参数,我已经在global.asax文件中使用unity注册了它们。

构造函数参数为引用类型时获取对象实例的基本方法:

var productSettingsRepo = 
      ServiceLocator.Current.GetInstance<ProductSettingsRepository>();
public ProductSettingsRepository(ILogWriter logWriter, 
          ISecurityFunctionRepository securityRepo,
          IProductSettingsManager productSettingsManager,
          IReferenceDataService referenceDataService, 
          string productCode)
      {
          _logWriter = logWriter;
          _securityRepo = securityRepo;
          _productSettingsManager = productSettingsManager;
          _referenceDataService = referenceDataService;
          ProductInfo = GetProductData(productCode);
      }

ServiceLocator通过传递构造参数获得实例

服务定位器模式被认为是一种反模式,您可能想要重构以使用依赖注入。

话虽如此,这里有一种不需要重构就能解决问题的方法:

创建一个工厂接口和类,依赖于服务定位器来创建一个ProductSettingsRepository类,给出如下的产品代码:

public interface IProductSettingsRepositoryFactory
{
    ProductSettingsRepository Create(string productCode);
}
public class ProductSettingsRepositoryFactory : IProductSettingsRepositoryFactory
{
    public ProductSettingsRepository Create(string productCode)
    {
        return new ProductSettingsRepository(
            ServiceLocator.Current.GetInstance<ILogWriter>(),
            ServiceLocator.Current.GetInstance<ISecurityFunctionRepository>(),
            ServiceLocator.Current.GetInstance<IProductSettingsManager>(),
            ServiceLocator.Current.GetInstance<IReferenceDataService>(),
            productCode);
    }
}

然后确保你像这样在unity容器中注册这个工厂:

unity_container
   .RegisterType<IProductSettingsRepositoryFactory, ProductSettingsRepositoryFactory>();

然后,你可以这样使用:

var factory = ServiceLocator
                   .Current
                   .GetInstance<IProductSettingsRepositoryFactory>();
var productSettingsRepo = factory.Create("my product code");