ServiceLocator gets an instance by passing a build parameter

How can I get an instance of an object using a service locator using the constructor below. ProductCode

is a constructor parameter used to initialize element properties. For all other constructor parameters, I registered them with a unit in the file global.asax

.

The basic way to get an instance of an object if the constructor parameters are of a reference type:

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);
      }

      

+4


source to share


1 answer


The Service Locator pattern is considered anti-pattern and you may want to refactor to use Dependency Injection .

Having said that, here's one way you can fix your problem without refactoring:

Create a factory interface and a class that depends on the service locator to create a class ProductSettingsRepository

given a product code like this:

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);
    }
}

      



Then make sure you register this factory with your Unity container like this:

unity_container
   .RegisterType<IProductSettingsRepositoryFactory, ProductSettingsRepositoryFactory>();

      

Then you can use it like this:

var factory = ServiceLocator
                   .Current
                   .GetInstance<IProductSettingsRepositoryFactory>();

var productSettingsRepo = factory.Create("my product code");

      

+2


source







All Articles