Вы можете попробовать фабричный класс (класс строителя, вероятно, неправильный)
public class ServiceFactory : IServiceFactory
{
private readonly Dictionary<int, IService> _services = new Dictionary<int, IService>();
private readonly IConfigurationProvider _configurationProvider;
public ServiceFactory(IConfigurationProvider configurationProvider)
{
_configurationProvider = configurationProvider;
}
public IService GetService(int id)
{
if (!_services.ContainsKey(id))
{
var config = _configurationProvider.GetConfiguration(id);
var service = new Service(config);
_services.Add(id, service);
}
return _services[id];
}
}
Это создаст экземпляр службы и сохранит ссылку на него на время существования фабричного класса, поэтому его нужно создавать только один раз. Затем зарегистрируйтесь и введите ServiceFactory в свой контроллер.
public class FooController : ApiController
{
private readonly IServiceFactory _serviceFactory;
public FooController(IServiceFactory serviceFactory)
{
_serviceFactory = serviceFactory;
}
public IHttpActionResult Bar(int id, int bar)
{
var service = _serviceFactory.GetService(id);
var barResult = service.Bar(bar);
return Ok(barResult);
}
}
Теперь ваш контроллер по-прежнему тестируем, и вам не нужно беспокоиться о том, что Configure () вызывается, поскольку id является зависимостью от конструктора службы.
P.S. Нет неуважения к @Ahmed Sherien, но не используйте Unity, он старый и медленный !!! ; -)