我是后端系统开发专家,善于Dapr和.Net7/.Net8/.Net9搭建系统架构,为解决技术难题、优化系统架构、提高程序性能而设计的。他们专注于后端逻辑的实现和维护,帮助用户构建稳定、高效的后端服务。
// .dapr/components/statestore.yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: localhost:6379
- name: redisPassword
value:
- name: actorStateStore
value: true
// .dapr/config/config.yaml
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
tracing:
samplingRate: 1
zipkin:
endpointAddress: http://localhost:9411/api/v2/spans
nameResolution:
component: consul
configuration:
client:
address: localhost:8500
selfRegister: true
csharp
// Api/Controllers/BaseController.cs
///
/// 控制器基类
///
[ApiController]
public class BaseController : ControllerBase
{
}
csharp
// Api/Extensions/ApiVersionInfo.cs
///
/// api版本号
///
public class ApiVersionInfo
{
///
/// 版本:v1
///
public static string v1;
}
csharp
// Api/Extensions/CustomExtensions.cs
///
///
///
public static class CustomExtensions
{
public static void MapCustomHealthChecks(this WebApplication app)
{
app.MapHealthChecks(/dapr, new HealthCheckOptions()
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
});
app.MapHealthChecks(/app);
}
}
csharp
// Api/Extensions/DaprHealthCheck.cs
///
///
///
public class DaprHealthCheck : IHealthCheck
{
private readonly DaprClient _daprClient;
public DaprHealthCheck(DaprClient daprClient)
{
_daprClient = daprClient;
}
public async Task
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
var healthy = await _daprClient.CheckHealthAsync(cancellationToken);
if (healthy)
{
return HealthCheckResult.Healthy(Dapr sidecar 运行正常。);
}
return HealthCheckResult.Unhealthy(Dapr sidecar 运行异常。);
}
}
csharp
// Api/Extensions/ProgramExtensions.cs
///
///
///
public static class ProgramExtensions
{
private const string appName = API;
public static void AddCustomServices(this WebApplicationBuilder builder)
{
builder.Services.AddSingleton
builder.Services.AddMemoryCache(options =>
{
options.CompactionPercentage = 0.5; // 设置压缩百分比
});
}
public static void AddCustomDaprdProcess(this WebApplicationBuilder builder)
{
var vConfigurationManager = builder.Configuration;
var appId = vConfigurationManager.GetValue(AppProfile:AppId, jytplatformequpmentapi);
var appPort = vConfigurationManager.GetValue(AppProfile:AppPort, 8118);
var daprHttpPort = vConfigurationManager.GetValue(AppProfile:DaprHttpPort, 18118);
var daprGrpcPort = vConfigurationManager.GetValue(AppProfile:DaprGrpcPort, 28118);
var otherDaprConfig = $--config .dapr/config/config.yaml --resources-path .dapr/components --log-as-json;
#if DEBUG
BaseHelper.AddDaprdProcess(appId, appPort, daprHttpPort, daprGrpcPort, otherDaprConfig);
builder.Services.AddControllers().AddDapr(config =>
{
config.UseHttpEndpoint($http://localhost:{daprHttpPort});
config.UseGrpcEndpoint($http://localhost:{daprGrpcPort});
});
#else
builder.Services.AddControllers().AddDapr();
#endif
}
public static void AddCustomAutofac(this WebApplicationBuilder builder)
{
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer
{
builder.RegisterModule
});
}
public static void AddCustomLog(this WebApplicationBuilder builder)
{
builder.Host.UseSerilog((hostingContext, loggerConfiguration) =>
{
const string vOutputTemplate = {Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception};
loggerConfiguration.MinimumLevel.Information()
.MinimumLevel.Override(Default, LogEventLevel.Information)
.MinimumLevel.Override(Microsoft, LogEventLevel.Error)
.MinimumLevel.Override(Microsoft.Hosting.Lifetime, LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console(outputTemplate: [{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}, theme: Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code)
.WriteTo.File(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Logs, log-.txt),
rollingInterval: RollingInterval.Hour,
outputTemplate: vOutputTemplate,
retainedFileCountLimit: 100)
.WriteTo.Logger(s => s.Filter.ByIncludingOnly(e => e.Level >= LogEventLevel.Warning)
.WriteTo.File(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Logs, errors, log-.txt),
rollingInterval: RollingInterval.Day,
outputTemplate: vOutputTemplate,
retainedFileCountLimit: 100));
var esUrl = hostingContext.Configuration.GetSection(ElasticSearchUrl).Value;
var indexFormat = ${appName} + -{0:yyyy.MM};
if (!string.IsNullOrWhiteSpace(esUrl))
{
loggerConfiguration.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(esUrl))
{
MinimumLogEventLevel = LogEventLevel.Information,
AutoRegisterTemplate = true,
IndexFormat = indexFormat
});
}
});
}
public static void AddCustomMVC(this WebApplicationBuilder builder)
{
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
//数据格式原样输出
options.JsonSerializerOptions.PropertyNamingPolicy = null;
//取消Unicode编码
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
//允许额外符号
options.JsonSerializerOptions.AllowTrailingCommas = true;
});
builder.Services.AddCors(options =>
{
options.AddPolicy(CorsPolicy, policy =>
{
var withOrigins = builder.Configuration[WithOrigins];
if (!string.IsNullOrWhiteSpace(withOrigins) && withOrigins.Split(;).Length > 0)
policy.WithOrigins(withOrigins.Split(;));
else
policy.SetIsOriginAllowed((host) => true);
policy.AllowAnyMethod();
policy.AllowAnyHeader();
policy.AllowCredentials();
});
});
}
public static void AddCustomDbContext(this WebApplicationBuilder builder)
{
AppContext.SetSwitch(Npgsql.EnableLegacyTimestampBehavior, true);
AppContext.SetSwitch(Npgsql.DisableDateTimeInfinityConversions, true);
var vDbType = builder.Configuration[CurrentDbType];
IocDbType vIocDbType = IocDbType.SqlServer;
switch (vDbType)
{
case SqlServer:
vIocDbType = IocDbType.SqlServer;
break;
case MySql:
vIocDbType = IocDbType.MySql;
break;
case PostgreSQL:
vIocDbType = IocDbType.PostgreSQL;
break;
}
builder.Services.AddSqlSugar(new IocConfig()
{
ConfigId = EquipmentAPI,
ConnectionString = builder.Configuration[$DataBase:{vIocDbType}:Database_ConnString],
DbType = vIocDbType,
IsAutoCloseConnection = true
});
//AOP 统一配置 禁止循环,只能声名一次
builder.Services.ConfigurationSugar(db =>
{
//里面可以循环
db.GetConnection(API).Aop.OnLogExecuting = (sql, p) =>
{
#if DEBUG
//ConsoleColor currentForeColor
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 dapr-dotnet-1776113582 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 dapr-dotnet-1776113582 技能
skillhub install dapr-dotnet-1776113582
文件大小: 10.77 KB | 发布时间: 2026-4-15 12:24