В настоящее время я не верю, что Finbuckle и Autofa c .Multitenant совместимы.
Autofa c Поддержка нескольких арендаторов для ASP. NET Core зависит от запуска первым вещь в конвейере промежуточного программного обеспечения, поэтому он может установить HttpContext.RequestServices
в соответствии с областью действия арендатора . Как часть этого, конечно, стратегия идентификации арендаторов будет работать.
Однако Finbuckle предполагает, что каждый арендатор совместно использует контейнер , как по умолчанию ASP. NET Core функциональность. Промежуточное программное обеспечение Finbuckle пытается использовать HttpContext.RequestServices
для идентификации арендатора на основе зарегистрированных стратегий .
Вы можете увидеть проблему, возникающую из-за проблемы с курицей и яйцом - службы запросов должны основываться в области времени жизни арендатора, но стратегия идентификации арендатора требует разрешения вещей из служб запросов.
Однако давайте на секунду проигнорируем это, потому что вопрос заключался в том, как избежать вызова базы данных для идентификации на каждом разрешить.
Если вы погрузитесь в код Finbuckle, промежуточное ПО устанавливает информацию об арендаторе на HttpContext.Items
как часть их работы промежуточного ПО. Позже, когда вы извлекаете информацию об арендаторе, она извлекается из HttpContext.Items
, а не повторно разрешается через базу данных . Вызов базы данных выполняется только один раз, при первом запуске ИД арендатора.
Это, вероятно, хорошо. В зависимости от того, сколько арендаторов вы планируете поддерживать и как часто они меняются, может быть, стоит добавить какой-нибудь слой кэширования в памяти, который вы можете использовать для хранения данных идентификатора арендатора (все, что хранится в базе данных, помогает идентифицировать этого арендатора). так что вы можете попробовать в хранилище в памяти, прежде чем попасть в базу данных. Может быть, там периодически истекает срок действия данных, или же это фиксированный размер, или что-то в этом роде ... стратегия кэширования полностью зависит от приложения, и я никак не мог бы порекомендовать какие-либо особенности в этом отношении. Суть в том, что это один из способов облегчить вызов базы данных.
Но возвращаясь к проблеме курица / яйцо, я не вижу простого способа обойти это.
Если бы это был я и Мне нужно было заставить это работать, я, вероятно, пропустил бы вызов IApplicationBuilder.UseMultiTenant()
extension , а затем создал бы свою собственную версию их промежуточного программного обеспечения , которая вместо , используя HttpContext.RequestServices
чтобы получить стратегии ID арендатора , должен взять контейнер с несколькими арендаторами прямо в конструкторе, например, мультитенантное промежуточное ПО Autofa c и напрямую использовать контейнер уровня приложения для разрешения этих стратегий . Это, конечно, должно быть запущено до промежуточного программного обеспечения для служб многопользовательских запросов Autofa c, и принудительное выполнение заказа промежуточного программного обеспечения является болезненным . Наконец, поскольку HttpContext.Items
в конечном итоге будет иметь идентификацию арендатора после запуска этого промежуточного программного обеспечения, ваша Autofa c ITenantIdentificationStrategy
может просто посмотреть туда, чтобы получить данные и вообще не вызывать базу данных.
Однако ...
ОГРОМНЫЙ, ИЗУМИТЕЛЬНО ВАЖНЫЙ ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
- Я никогда в жизни не использовал Finbuckle. Я могу просмотреть код на GitHub, но я не знаю, какие побочные эффекты могут иметь вышеуказанные соображения.
- На самом деле я не пробовал вышеуказанное рассмотрение. Это может не сработать.
- Я поддерживаю проект Autofa c и написал оригинальную поддержку нескольких арендаторов, включая оригинальную интеграцию с ASP. NET Core. Было очень больно заставить его работать ... поэтому, когда я говорю, что вышеупомянутое соображение может быть хитрым, я был там.
- Я очень конкретно называю это "рассмотрением" - что-то рассмотреть - и не является рекомендацией , потому что я не собираюсь обязательно «рекомендовать» то, в чем я не очень уверен. У меня нет уверенности, потому что, опять же, я не не использую Finbuckle.
МОЯ АКТУАЛЬНАЯ РЕКОМЕНДАЦИЯ ... ну, немного замедлиться. Как вы упомянули, вы новичок в этой области, и кажется, что материал, с которым вы собираетесь здесь столкнуться, довольно глубокий. Я рекомендую погрузиться в реальный код Finbuckle на GitHub , если вы этого не сделали. Не похоже, что есть много, и это может дать вам некоторое представление о том, что происходит. Я рекомендую попробовать создать мультитенантное приложение с просто Autofa c с несколькими арендаторами и одно с просто Finbuckle. Посмотри, действительно ли тебе нужны оба. Может быть, только один имеет смысл. Например, кажется, что Finbuckle уже имеет многопользовательский режим для хранения данных; это то, для чего многие люди также используют мультитенантность Autofa c - для регистрации различных контекстов базы данных для каждого арендатора. Возможно, было бы достаточно использовать только один из продуктов, и это могло бы устранить всю проблему.