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);
}
source to share
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");
source to share