📔 سادهتر شدن اجرای نرمافزارهای کوچیک در داتنت ۱۰
📔 سادهتر شدن اجرای نرمافزارهای کوچیک در داتنت ۱۰
نسخه پیشنمایش ۴ داتنت ۱۰ امکانی رو فراهم کرده تا بودن فایل پراجکت و سولوشن هم به راحتی بشه کد سیشارپ نوشت. قبلا با استفاده از فایلهای اسکریپت csx. هم میشد این کار رو کرد، ولی امکان جدید، جامعتر و سادهتره.
کابردش: آموزش، اسکریپتهای مورد استفاده برای DevOps و...
ابتدای فایل به ذکر :# و بعدش skd یا package چیزهایی رو که قبلا توی فایل csproj مشخص میکردیم، اینجا میتونیم توی یک فایل قرار بدیم.
مثلا: کد زیر فقط با یه فایل cs کار میکنه و چک میکنه اگر rabbitmq و postgresql اوکی بودن، ورژن نرمافزار رو توی دیتابیس بهروز میکنه و یه وبپیچ هم محیا میکنه برای مشاهده وضعیت.
#! /usr/bin/dotnet run
#:sdk Microsoft.NET.Sdk.Web
#:package [email protected].*
#:package [email protected].*
#:package [email protected].*
using Markdig;
using Npgsql;
using RabbitMQ.Client;
using System.Reflection;
var rabbitMqHost = Environment.GetEnvironmentVariable("RABBITMQ_CONNECTION_STRING")
?? "amqp://guest:guest@localhost:5672/";
var pgConnStr = Environment.GetEnvironmentVariable("POSTGRES_CONNECTION_STRING")
?? "Host=localhost;Username=postgres;Password=yourpassword;Database=yourdb";
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", async () =>
{
bool rabbitOk = false;
try
{
var factory = new ConnectionFactory() { Uri = new Uri(rabbitMqHost) };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
rabbitOk = connection.IsOpen && channel.IsOpen;
}
catch { rabbitOk = false; }
bool pgOk = false;
string errorMsg = "";
try
{
using var conn = new NpgsqlConnection(pgConnStr);
await conn.OpenAsync();
pgOk = conn.State == System.Data.ConnectionState.Open;
var version = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "unknown";
var now = DateTime.Now;
using var cmd = new NpgsqlCommand(
"INSERT INTO application (checked_at, version, rabbitmq_ok, postgres_ok) VALUES (@date, @ver, @rmq, @pg)", conn);
cmd.Parameters.AddWithValue("date", now);
cmd.Parameters.AddWithValue("ver", version);
cmd.Parameters.AddWithValue("rmq", rabbitOk);
cmd.Parameters.AddWithValue("pg", pgOk);
await cmd.ExecuteNonQueryAsync();
}
catch (Exception ex)
{
errorMsg = ex.Message;
}
var content = $"""
System Health Check
- RabbitMQ: {(rabbitOk ? "OK" : "FAILED")}
- PostgreSQL: {(pgOk ? "OK" : "FAILED")}
{(string.IsNullOrWhiteSpace(errorMsg) ? "" : $"\n- Error: {errorMsg}")}
""";
return Results.Content($"""
{Markdown.ToHtml(content)}
""", "text/html");
});
app.Run();