У меня есть служба, которая должна поддерживать прямое соединение с базой данных. Это соединение должно создаваться перед любым клиентским запросом.
Поскольку API базы данных предоставляет асинхронный метод для подключения к нему, где это возможноя подключаюсь к базе данных до того, как будет выдан какой-либо запрос?
SocketMiddleware :
class SocketMiddleware
{
Handler handler;
public SocketMiddleware(Handler _handler,RequestDelegate del)
{
this.handler = _handler;
this.next = del;
}
RequestDelegate next;
public async Task Invoke(HttpContext context)
{
if (!context.WebSockets.IsWebSocketRequest)
{
await this.next(context);
return;
}
await this.handler.AddClientAsync(context.WebSockets);
}
}
Служба , использующая прямое RethinkDB
соединение:
class Handler
{
private readonly RethinkDB r;
public Connection Con { get; private set; }
private ConcurrentDictionary<string, Client> clients = new ConcurrentDictionary<string, Client>();
private object Lock = new object();
public Handler()
{
this.r = new RethinkDB();
//I have to instnatiate --- this.Con = this.r.Connection().Port(Constants.RETHINK_PORT).Hostname(Constants.HOST_NAME).ConnectAsync();
}
///////////////////////////---Where can i run the below method?
public async Task ConnectRethinkAsync()
{
using (Process proc = new Process())
{
proc.StartInfo = new ProcessStartInfo(Constants.RETHINK_PROCESS_PATH);
proc.Start();
this.Con = await this.r.Connection().Port(Constants.RETHINK_PORT).Hostname(Constants.HOST_NAME).ConnectAsync();
}
}
public async Task AddClientAsync(WebSocketManager manager)
{
WebSocket clientSocket = await manager.AcceptWebSocketAsync();
string clientID = Ext.MakeId();
using (Client newClient = Client.Create(clientSocket, clientID))
{
while (true)
{
if (!newClient.KeepAlive)
{
break;
}
ReadOnlyMemory<byte>received = await newClient.ReceiveAsync();
string toSend = $"From Server:\r\nDate:{DateTime.Now.ToString()},WasReceived:{Encoding.UTF8.GetString(received.ToArray())}\r\nEnd of Message\r\n";
// await r.Db(Constants.DB_NAME).Table(Constants.TABLE_NAME).RunAsync(this.Con);
await newClient.SendAsync(toSend);
}
}
}
public bool RemoveClient(string ID)
{
if (this.clients.TryRemove(ID, out Client value))
{
value.Dispose();
return true;
}
return false;
}
}
PS: В приведенном выше фрагменте наиболее важной является строка с комментарием: мне нужно создать экземпляр Connection , который является асинхронной операцией.
Я не могуинстанцировать его в Handler
ctor или в SocketMiddleware
ctor.
Con
должен быть инициализирован перед выполнением любого запроса. (в нашем случае - AddClientAsync
вызывается) Если соединение с базой данных будет выполненов другом сервисе?