Skip to content

Latest commit

 

History

History
169 lines (122 loc) · 7.3 KB

README.ru.md

File metadata and controls

169 lines (122 loc) · 7.3 KB

SignalR.EasyUse

SignalR

GitHub last commit GitHub code size in bytes

GitHub search hit counter Nuget Nuget Nuget

Что это?

SignalR.EasyUse — это фреймворк, который помогает избежать ошибок несоответствия контрактов при создании клиентских и серверных приложений на C# с использованием SignalR.

Как использовать?

Создание интерфейса

  1. Создайте новый проект-библиотеку в своем решении, который будет содержать контракты.
  2. Добавьте пакет NuGet в этот проект:
Install-Package SignalR.EasyUse.Interface

Определение серверных методов

  1. Создайте интерфейс с методами сервера. Имена методов интерфейса будут использоваться как идентификаторы, а параметры — передаваться как есть. Возвращаемое значение метода должно быть типа Task или Task<TResult>.
  2. Интерфейс может наследоваться от SignalR.EasyUse.Interface.IServerMethods для удобного различения, но это не обязательно.

Пример:

public interface IChatHub: IServerMethods
{
    Task SendMessage(string user, string message);
    Task<List<User>> Login(string name, byte[] photo);
}

Определение клиентских методов

  1. Для методов клиента создайте класс для каждого метода. Имя класса будет использоваться как идентификатор, а все его публичные свойства будут передаваться как параметры в порядке их объявления.
  2. Эти классы могут наследоваться от SignalR.EasyUse.Interface.IClientMethod, но это не обязательно.

Пример:

public class ReceiveMessage: IClientMethod
{
    public string User { get; set; }
    public string Message { get; set; }
}

Использование интерфейсов на сервере

  1. Добавьте ссылку на проект с контрактами.
  2. Добавьте пакет NuGet в проект сервера:
Install-Package SignalR.EasyUse.Server
  1. Реализуйте интерфейс сервера. Благодаря этому реализации будут соответствовать описанным контрактам.
  2. Для отправки сообщений клиентам можно использовать строго типизированные вызовы с помощью метода расширения:
async Task SendAsync<T>(this IClientProxy clients, T payload)

Пример:

public class ChatHub : Hub, IChatHub
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync(new ReceiveMessage
        {
            User = user,
            Message = message,
        });
        
        // Эквивалентный нативный вызов
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

Использование интерфейсов на клиенте

  1. Добавьте ссылку на проект с контрактами.
  2. Добавьте пакет NuGet в проект клиента:
Install-Package SignalR.EasyUse.Client
  1. Создайте подключение к хабу:
_connection = new HubConnectionBuilder()
                .WithUrl("http://localhost:53353/ChatHub")
                .Build();
  1. Создайте динамический прокси для хаба на основе интерфейса:
var hub = _connection.CreateHub<IChatHub>();
  1. Используйте прокси для вызова методов сервера:
var users = await hub.Login(UserName, Photo);
await hub.SendMessage(UserName, MessageText);

Пример без использования EasyUse:

var users = await connection.InvokeCoreAsync<List<User>>("Login", new object[] { UserName, Photo });
await _connection.InvokeAsync("SendMessage", UserName, MessageText);
  1. Для подписки на сообщения от сервера используйте метод расширения:
void Subscribe<T>(this HubConnection connection, Action<T> action)

Пример:

_connection.Subscribe<ReceiveMessage>(data =>
{
    var newMessage = $"{data.User}: {data.Message}";
    Messages.Add(newMessage);
});

Пример без использования EasyUse:

_connection.On<string, string>("ReceiveMessage", (user, message) =>
{
    var newMessage = $"{user}: {message}";
    Messages.Add(newMessage);
});

Получить пример

Для ознакомления с работающими проектами, использующими этот фреймворк, перейдите по следующим ссылкам:

Связь

Буду рад вашим предложениям и комментариям. Для связи используйте Telegram.