Как установить строку подключения Dynami c в репозиторий EF в SignalR Hub в приложении с несколькими базами данных? - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над добавлением функции чата SignalR в существующее приложение (что означает, что я не могу изменить архитектуру приложения), и столкнулся с проблемой при подключении к моей базе данных, чтобы обрабатывать управление группами / сохранение / историю сообщений . Часть самой строки подключения создается, когда пользователь входит в приложение, форматируется и сохраняется как переменная сеанса. Формат следующий: "ServerName\\InstanceName".

Очевидно, Сессия недоступна из концентраторов SignalR , и поскольку концентратор создается до того, как пользователь входит в систему, я не могу передать значение в его конструктор из моего класса Startup.

Для справки, вот часть моего класса-концентратора, показывающая, как я передаю в репозиторий через конструктор. При обычном использовании приложение берет строку подключения из сеанса и передает ее вызову .ConnectToInstance(), который у меня также есть в конструкторе. Я установил DependencyResolver в своем классе запуска для обработки внедрения репозитория.

public class ChatHub : Hub
{
    private static readonly ConnectionMap<string> _connections = new ConnectionMap<string>();
    private readonly IChatRepository _chatRepository;

    public ChatHub(IChatRepository repository)
    {
        _chatRepository = repository;
        // _chatRepository.ConnectToInstance(CONNECTION_STRING_HERE)
    }

    public void JoinGroup(string groupName)
    {
        var group = _chatRepository.GetChatGroup(groupName);
        var chatUser = _chatRepository.GetChatUser(Context.User.Identity.Name);
        if (group == null)
        {
            var newGroup = new ChatGroup
            {
                RoomName = groupName
            };
            _chatRepository.CreateChatGroup(group);

            if (chatUser != null)
            {
                _chatRepository.AddUserToGroup(chatUser, newGroup);
                Groups.Add(Context.ConnectionId, groupName);
            }
            
        }
        else
        {
            _chatRepository.AddUserToGroup(chatUser, group);
            Groups.Add(Context.ConnectionId, groupName);
        }
    }
    ... Other methods below ...
}

В настоящее время решение, которое я пытаюсь сделать, кажется довольно неправильным - я пытаюсь установить для переменных сеанса 1030 * переменных в моем .cshtml файле, фрагмент ниже.

<script>
    var activeConnection = '@Session["ActiveConnection"]');
</script>

Затем я пытаюсь передать это значение через строку запроса концентратора в переопределение метода OnConnected() в моем концентраторе сигналов. . Там я бы позвонил .ConnectToInstance(), используя эту строку подключения, и это настроило бы репозиторий и позволило бы мне подключиться к базе данных.

$(document).ready(function () {
    $.connection.hub.qs = { 'activeConnection': activeConnection };
    ...
    Other Code
    ...
    $.connection.hub.start().done(function () {
        // TODO: Pass correct group
        chatHub.server.joinGroup("primaryGroup");
    });
}

Это почти работает, однако Javascript удаляет двойной backsla sh в соединении (см. Формат в первом абзаце). Это, конечно, делает строку подключения недействительной. Я также не могу динамически добавить \\ обратно, поскольку имена серверов и экземпляров, используемые для его создания, похоже, не соответствуют каким-либо конкретным соглашениям. Опять же, я не могу это изменить.

Есть ли лучший способ справиться с этим, чем передача строки подключения через Javascript? Если нет, как мне предотвратить удаление JS \\ в строке подключения? Для справки, одна backsla sh удаляется, когда я впервые устанавливаю эту переменную activeConnection, а вторая удаляется, когда я передаю ее в строку запроса хаба. Я пробовал использовать String.raw(), но это не сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...