В настоящее время я застрял на том, что я считаю простой проблемой архитектуры.
У меня есть контроллер (это просто примеры, так как я не могу поделиться своим реальным кодом, но принцип верен):
public class StackOverflowController : Controller
{
private readonly IStackOverflowService stackOverflowService;
public StackOverflowService (IStackOverflowService stackOverflowService)
{
this.stackOverflowService = stackOverflowService;
}
// GET: StackOverflow
public ActionResult Index()
{
var foo = stackOverflowService.Get(bar);
return View(foo);
}
}
Я использую загрузчик Unity MVC4 для управления инъекциями:
public static class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IStackOverflowService, StackOverflowService>("DefaultStackOverflowService");
return container;
}
}
Пока все хорошо, уколы работают. Где я застреваю, так это в том, что теперь легко основываясь либо на конфигурации, либо на какой-то переменной, которую я хочу изменить в реализации StackOverflowService
.
Так, например, если url = "somethingelse.com", я хочу иметь возможность автоматически вводить CustomStackOverflowService, который наследуется от IStackOverflowService. Но тут я теряюсь. Я пытался использовать именованную регистрацию, но не могу понять, как вручную разрешить правильную службу для реализации на основе некоторых альтернативных критериев.
Если бы кто-нибудь мог помочь, это было бы эпично :)
EDIT: Критерии для изменения реализации в идеале должны быть определены в режиме реального времени, так сказать, на основе фактического URL-адреса, который в настоящее время посещается. Это многофункциональная среда, так что это может быть что-то вроде domain.com/stackoverflow
против domain2.com/stackoverflow.
. Реализация должна быть разной для каждого сайта. Я даже не знаю, возможно ли это, если честно, и как это сделать. Я довольно новичок во всей теме IoC.
РЕДАКТИРОВАТЬ 2: я немного продвинулся в этом вопросе и смог вручную вызвать конкретную реализацию. Сейчас я рассматриваю возможность использования фабрики пользовательских контроллеров, чтобы решить, какую реализацию использовать, но я не уверен, что это правильный путь или есть более простой способ сделать это.
Мне нужно иметь в виду, что по мере того, как появляется больше клиентов, мне нужно иметь возможность быстро добавлять больше реализаций для каждого нового клиента. Поэтому в идеале у меня был бы простой способ управлять методами для конкретного клиента.
EDIT 3: Дальнейшее обновление: я переписал свой контроллер, чтобы разрешить внедрение конструктора для определения зависимости. Однако моя первоначальная проблема все еще действительна, так как она срабатывает при создании контроллера, у меня нет доступа к запросу и, следовательно, я не могу определить URL-адрес для разрешения зависимости. Любые идеи были бы хорошы.