Если вам нужно было сделать это только в одном месте, тогда фабричный шаблон (см. Пример замены директив компилятора) для возврата реализации арендатора или что-то подобное - опция.
Если это более специфичные для арендатора версии, делать это напрямую с DI намного проще, чем время сборки.Даже если вы просто зарегистрируете дополнительные реализации арендатора, контейнер DI, такой как Autofac, извлечет последнюю соответствующую регистрацию, если вы не запросите IEnumerable услуг.Если бы это был я, я бы использовал Dependency Injection и рассматривал приложение как мультитенантное.Возможно, каждое приложение работает изолированно, но код по-прежнему мультитенантен.
Если бы у вас было много регистраций, я бы использовал дочерние контейнеры для хранения регистраций, специфичных для каждого арендатора.
Если вы используете Autofac, то это расширение будет работать - https://github.com/autofac/Autofac.AspNetCore.Multitenant или https://github.com/autofac/Autofac.Multitenant (если не .Net Core)
Мы использовали его с несколькими стратегиями дляопределить владельца - проще всего был параметр конфигурации в app.config, который сообщал ему, от какого клиента он работает.Текущий основан на имени хоста, поэтому все клиенты работают под одним приложением.Если бы это было локальное приложение, я бы ожидал настройки в конфигурации, которые бы указывали на то, какой арендатор будет.