Я хочу добавить сервер REST API в свое приложение WinForms. Я решил использовать для этой цели Grapveine.
Вот мой код:
namespace RestServerTest
{
public partial class Form1 : Form
{
private RestServer mServer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
mServer = new RestServer();
mServer.Start();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mServer.Stop();
mServer.Dispose();
}
}
[RestResource]
class MyRoute
{
[RestRoute]
public IHttpContext HelloWorld(IHttpContext context)
{
// Todo: how access form object from here?
context.Response.SendResponse("Hello, world.");
return context;
}
}
}
В настоящее время я не знаю, как на самом деле получить доступ к моему объекту Form из маршрута REST (без использования уродливой глобальной / статической переменной).
Как сделать это элегантно?





Если вы хотите, чтобы текущая форма (или любой другой объект / переменная в вашем проекте) была доступна для ваших маршрутов, вы можете воспользоваться Динамические свойства. И IRestServer, и IHttpContext реализуют IDynamicProperties, что дает вам два пути достижения вашей цели.
Добавьте любой из них в свой метод Form1_Load().
Добавить ссылку на сервер
server.Properties.Add("CurrentForm", this);
Добавить обработчик событий BeforeRouting
server.Router.BeforeRouting += cxt =>
{
cxt.Properties.Add("CurrentForm", this);
};
Доступ к собственности на маршруте
В любом случае вы можете получить доступ к свойству, используя встроенные методы расширений:
// On the server
var form = context.Server.GetPropertyValueAs<Form1>("CurrentForm");
// On the context
var form = context.GetPropertyValueAs<Form1>("CurrentForm");