My application deals with multiple clients and each client has different settings.
So I have decided to use IOC container to register each client specific settings using a key
. Then i am locating ClientSettings based on akey
. key
value will be available during runtime.
C# Library MyCompany.BO
public class ClientSettings : IClientSettings
{
public string ClientApiKey { get; private set}
public string ClientId { get; private set}
public static IClientSettings Load(string clientname)
{
// Load the client specific information from JSON file using clientname
var cs = new ClientSettings();
cs.ClientApiKey = "Some client specific key";
cs.ClientId = "Some client specific key";
return cs;
}
}
Consumed in MyCompany.BO namespace
public class RuleEngine : IRuleEngine
{
IFactory _factory;
RuleEngine(IFactory factory)
{
factory = _factory;
}
public void Run(string request)
{
var clientname = ParseStringToGetClientName(request)
var clientSettings = ServiceLocator.Current.GetInstance<IClientSettings>(clientname);
var service = _factory.GetService(clientname);
service.DoWork(clientSettings);
}
}
Main Application registering the client settings
var container = new UnityContainer();
var clientASettings = ClientSettings.Load("ClientA");
var clientBASettings = ClientSettings.Load("ClientB");
var clientCSettings = ClientSettings.Load("ClientC");
// register singleton instance
container.RegisterInstance("ClientA", clientASettings);
container.RegisterInstance("ClientB", clientBSettings);
container.RegisterInstance("ClientC", clientCSettings);
Question
The RuleEngine class is using Microsoft.Practices.ServiceLocation.ServiceLocator
to locate ClientSettings
based on the key
. That means C# library where rule engine is implemented needs to use the same IOC that application is using. (Which is Unity in this case)
How do I make library unaware of IOC container?
How do I inject clientsettings here without using ServiceLocator when the key
value known during runtime?
Is the factory pattern the only way to achieve this? (For example the way I am locating service _factory.GetService(clientname)
)