Autofac - как зарегистрировать 2 разные версии одного типа с одинаковым именем

Нужна помощь по этому поводу. Был бы очень признателен.

Я пытаюсь зарегистрировать несколько версий типа для поддержания обратной совместимости в API. Этот API позволит выполнять операции с использованием более старых версий кода.

Для этого мой код делает следующее:

  1. Загрузите в память каждую версию каждого типа DLL.

    foreach (var directory in Directories)
    {
        assembliesToLoad.AddRange(directory.EnumerateFiles("*.dll").Select(file => Assembly.LoadFile(file.FullName)));
    }
    foreach (var assembly in assembliesToLoad)
    {
        RegisterActivityTypesFromAssembly(assembly);
    }
    
  2. Зарегистрируйте их с помощью Autofac в цикле.

    var type = value.Key;
    var version = $"{value.Value.Major}.{value.Value.Minor}.{value.Value.Build}";
    var typeId = $"{keyValuePair.Key}@{version}";
    if (type != null)
    {
        foreach (var interfaceType in type.GetInterfaces())
        {
            Builder.RegisterType(type).Named(typeId, interfaceType);
        }
    }
    
  3. Затем я загружаю его позже в конвейер на основе версии, указанной в API.

    var autofacTypeId = $"{_typeId}@{_version}";
    _activity = Scope.ResolveNamed<IActivity>(autofacTypeId);
    

Я заметил, что этот код без проблем разрешит текущую версию типа. Попытка разрешить более старые версии терпит неудачу. Что я здесь делаю не так? Похоже, что старые типы версий по какой-то причине ушли, хотя на этапе загрузки они, кажется, загружаются нормально после отражения.

Любая помощь будет принята с благодарностью.

Было бы здорово, если бы вы могли поделиться минимальный воспроизводимый пример, который мы могли бы запустить в консольном приложении на нашей стороне. Мне особенно интересно увидеть исходный код двух классов с одинаковым именем.

mjwills 26.09.2018 23:21

Обычно вы не можете загружать разные версии одной и той же сборки в AppDomain / context без «непредсказуемых» результатов. Вам нужно выполнять обе версии в одном экземпляре среды выполнения? Или просто придерживаться одного? Если в первом случае вам, вероятно, потребуется переработать часть, которая использует старую версию сборки для запуска в собственном домене приложений, если последняя ограничивает загруженную сборку желаемой версией (примечание: просто отражение сборки загружает ее).

softbear 27.09.2018 12:36

Похоже, что AppDomain - предпочтительный способ сделать это. У вас есть какие-нибудь полезные ссылки о том, как правильно использовать несколько доменов приложений?

Paul Gibler 27.09.2018 16:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
211
0

Другие вопросы по теме