Перевести реализации интерфейсов на явные (§11, вариант A)

Codemod scripts/make_explicit.py: 161 член в 30 прод-файлах конвертирован в
вид "Тип IFoo.Член" (частичные классы и многострочные сигнатуры учтены; Card и
ICard-семейство — DTO, оставлены implicit). Потребители, дёргавшие классы
напрямую, перетипизированы на интерфейсы: 8 мест в проде (самовызовы через
((ISessionClient)this), снят дефолт параметра в явной реализации) и 17 тестовых
файлов (поля, tuple-деконструкции, var/target-typed new). Build 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
This commit is contained in:
Rustam Khalimov
2026-09-11 20:16:06 +03:00
parent 355723f4ad
commit 206d61068a
48 changed files with 516 additions and 250 deletions
@@ -79,7 +79,7 @@ public sealed class AiConnectionChecker : IAiConnectionChecker
}
/// <inheritdoc />
public async Task<AiCheckResultDto> CheckAsync(AiCheckRequest request, CancellationToken ct)
async Task<AiCheckResultDto> IAiConnectionChecker.CheckAsync(AiCheckRequest request, CancellationToken ct)
{
ArgumentNullException.ThrowIfNull(request);
@@ -55,7 +55,7 @@ public sealed class BudgetedAiClassifier : IAiClassifier
}
/// <inheritdoc />
public async Task<AiFilterResultDto> FilterAsync(string text, CancellationToken ct)
async Task<AiFilterResultDto> IAiClassifier.FilterAsync(string text, CancellationToken ct)
{
if (await IsPaidAllowedAsync(ct))
{
@@ -68,7 +68,7 @@ public sealed class BudgetedAiClassifier : IAiClassifier
}
/// <inheritdoc />
public async Task<AiParsedCardDto> ClassifyAsync(string text, CancellationToken ct)
async Task<AiParsedCardDto> IAiClassifier.ClassifyAsync(string text, CancellationToken ct)
{
if (await IsPaidAllowedAsync(ct))
{
@@ -51,7 +51,7 @@ public sealed class BudgetedAiTools : IAiTools
}
/// <inheritdoc />
public async Task<AiGenerateKeywordsResultDto> GenerateKeywordsAsync(string description, CancellationToken ct)
async Task<AiGenerateKeywordsResultDto> IAiTools.GenerateKeywordsAsync(string description, CancellationToken ct)
{
BudgetStateDto state = await GateStateAsync(ct);
if (state.Allowed)
@@ -70,7 +70,7 @@ public sealed class BudgetedAiTools : IAiTools
}
/// <inheritdoc />
public async Task<AiEvaluateFitResultDto> EvaluateFitAsync(
async Task<AiEvaluateFitResultDto> IAiTools.EvaluateFitAsync(
string text,
string description,
IReadOnlyCollection<string> keywords,
@@ -48,7 +48,7 @@ public sealed class CbrRateSource : IRatesSource
}
/// <inheritdoc />
public async Task<Dictionary<string, double>?> FetchAsync(CancellationToken ct)
async Task<Dictionary<string, double>?> IRatesSource.FetchAsync(CancellationToken ct)
{
try
{
@@ -71,7 +71,7 @@ public sealed class GrpcAiClassifier : IAiClassifier
}
/// <inheritdoc />
public async Task<AiFilterResultDto> FilterAsync(string text, CancellationToken ct)
async Task<AiFilterResultDto> IAiClassifier.FilterAsync(string text, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -107,7 +107,7 @@ public sealed class GrpcAiClassifier : IAiClassifier
}
/// <inheritdoc />
public async Task<AiParsedCardDto> ClassifyAsync(string text, CancellationToken ct)
async Task<AiParsedCardDto> IAiClassifier.ClassifyAsync(string text, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
string systemPrompt = await _contextBuilder.BuildClassifySystemPromptAsync(ct);
@@ -71,7 +71,7 @@ public sealed class GrpcAiTools : IAiTools
}
/// <inheritdoc />
public async Task<AiGenerateKeywordsResultDto> GenerateKeywordsAsync(string description, CancellationToken ct)
async Task<AiGenerateKeywordsResultDto> IAiTools.GenerateKeywordsAsync(string description, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -105,7 +105,7 @@ public sealed class GrpcAiTools : IAiTools
}
/// <inheritdoc />
public async Task<AiEvaluateFitResultDto> EvaluateFitAsync(
async Task<AiEvaluateFitResultDto> IAiTools.EvaluateFitAsync(
string text,
string description,
IReadOnlyCollection<string> keywords,
@@ -98,7 +98,7 @@ public sealed class GrpcMlClient : IMlClient, IMlTrainClient
}
/// <inheritdoc />
public async Task<MlStatusResponseDto> StatusAsync(CancellationToken ct)
async Task<MlStatusResponseDto> IMlClient.StatusAsync(CancellationToken ct)
{
TenantId tenantId = RequireTenant();
MlStatusCache.Snapshot snapshot = await GetServiceSnapshotAsync(tenantId, ct);
@@ -123,7 +123,7 @@ public sealed class GrpcMlClient : IMlClient, IMlTrainClient
}
/// <inheritdoc />
public async Task<MlPredictResultDto> PredictAsync(string text, CancellationToken ct)
async Task<MlPredictResultDto> IMlClient.PredictAsync(string text, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -144,7 +144,7 @@ public sealed class GrpcMlClient : IMlClient, IMlTrainClient
}
/// <inheritdoc />
public async Task<MlResetResultDto> ResetAsync(CancellationToken ct)
async Task<MlResetResultDto> IMlClient.ResetAsync(CancellationToken ct)
{
TenantId tenantId = RequireTenant();
ResetReply reply;
@@ -172,7 +172,7 @@ public sealed class GrpcMlClient : IMlClient, IMlTrainClient
}
/// <inheritdoc />
public async Task PushAsync(
async Task IMlClient.PushAsync(
string text,
string label,
double delta,
@@ -182,7 +182,7 @@ public sealed class GrpcMlClient : IMlClient, IMlTrainClient
}
/// <inheritdoc />
public async Task<int> TrainBatchAsync(IReadOnlyList<MlOutboxEntryDto> items, CancellationToken ct)
async Task<int> IMlTrainClient.TrainBatchAsync(IReadOnlyList<MlOutboxEntryDto> items, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
var request = new TrainBatchRequest();
@@ -59,7 +59,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<TelegramAccountStatusDto> StatusAsync(CancellationToken ct)
async Task<TelegramAccountStatusDto> ITelegramGateway.StatusAsync(CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -82,7 +82,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<TelegramAuthResultDto> StartPhoneAsync(
async Task<TelegramAuthResultDto> ITelegramGateway.StartPhoneAsync(
string phone,
int apiId,
string apiHash,
@@ -105,7 +105,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<TelegramAuthResultDto> StartQrAsync(
async Task<TelegramAuthResultDto> ITelegramGateway.StartQrAsync(
int apiId,
string apiHash,
CancellationToken ct)
@@ -129,7 +129,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<string> SendCodeAsync(string code, CancellationToken ct)
async Task<string> ITelegramGateway.SendCodeAsync(string code, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -147,7 +147,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<string> SendPasswordAsync(string password, CancellationToken ct)
async Task<string> ITelegramGateway.SendPasswordAsync(string password, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -165,7 +165,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task LogoutAsync(CancellationToken ct)
async Task ITelegramGateway.LogoutAsync(CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -181,7 +181,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<IReadOnlyList<TelegramDialogEntryDto>> RefreshDialogsAsync(CancellationToken ct)
async Task<IReadOnlyList<TelegramDialogEntryDto>> ITelegramGateway.RefreshDialogsAsync(CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -198,7 +198,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task SetMonitorAsync(
async Task ITelegramGateway.SetMonitorAsync(
string dialogId,
bool enabled,
CancellationToken ct)
@@ -218,7 +218,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task SetMonitorAllAsync(bool enabled, CancellationToken ct)
async Task ITelegramGateway.SetMonitorAllAsync(bool enabled, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -235,7 +235,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<int> BackfillAsync(
async Task<int> ITelegramGateway.BackfillAsync(
string dialogId,
bool force,
CancellationToken ct)
@@ -256,7 +256,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<IReadOnlyList<TelegramRecentMessageDto>> ReadRecentAsync(
async Task<IReadOnlyList<TelegramRecentMessageDto>> ITelegramGateway.ReadRecentAsync(
string dialogId,
int limit,
CancellationToken ct)
@@ -279,7 +279,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<TelegramSourceContentDto> ReadSourceAsync(
async Task<TelegramSourceContentDto> ITelegramGateway.ReadSourceAsync(
string dialogId,
long msgId,
CancellationToken ct)
@@ -303,7 +303,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<IReadOnlyList<TelegramDialogEntryDto>> SearchAsync(
async Task<IReadOnlyList<TelegramDialogEntryDto>> ITelegramGateway.SearchAsync(
string query,
int limit,
CancellationToken ct)
@@ -324,7 +324,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<TelegramChannelInfoDto> InfoAsync(string dialogId, CancellationToken ct)
async Task<TelegramChannelInfoDto> ITelegramGateway.InfoAsync(string dialogId, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -350,7 +350,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task<TelegramEvalReadDto> ReadForEvalAsync(
async Task<TelegramEvalReadDto> ITelegramGateway.ReadForEvalAsync(
string dialogId,
int limit,
CancellationToken ct)
@@ -381,7 +381,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task JoinAsync(string username, CancellationToken ct)
async Task ITelegramGateway.JoinAsync(string username, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -398,7 +398,7 @@ public sealed class GrpcTelegramClient : ITelegramGateway
}
/// <inheritdoc />
public async Task LeaveAsync(string dialogId, CancellationToken ct)
async Task ITelegramGateway.LeaveAsync(string dialogId, CancellationToken ct)
{
TenantId tenantId = RequireTenant();
try
@@ -13,11 +13,11 @@ public sealed class LocalAiTools : IAiTools
"ИИ-инструменты доступны только при подключённом ai-service (Services:Ai:UseLocal=false).";
/// <inheritdoc />
public Task<AiGenerateKeywordsResultDto> GenerateKeywordsAsync(string description, CancellationToken ct)
Task<AiGenerateKeywordsResultDto> IAiTools.GenerateKeywordsAsync(string description, CancellationToken ct)
=> throw new NotSupportedException(NotSupportedMessage);
/// <inheritdoc />
public Task<AiEvaluateFitResultDto> EvaluateFitAsync(
Task<AiEvaluateFitResultDto> IAiTools.EvaluateFitAsync(
string text,
string description,
IReadOnlyCollection<string> keywords,
@@ -12,13 +12,13 @@ public sealed class LocalTelegramGateway : ITelegramGateway
private const string IdlePhase = "idle";
/// <inheritdoc />
public Task<TelegramAccountStatusDto> StatusAsync(CancellationToken ct)
Task<TelegramAccountStatusDto> ITelegramGateway.StatusAsync(CancellationToken ct)
{
return Task.FromResult(new TelegramAccountStatusDto(IdlePhase, false, false, string.Empty, null, null));
}
/// <inheritdoc />
public Task<TelegramAuthResultDto> StartPhoneAsync(
Task<TelegramAuthResultDto> ITelegramGateway.StartPhoneAsync(
string phone,
int apiId,
string apiHash,
@@ -26,7 +26,7 @@ public sealed class LocalTelegramGateway : ITelegramGateway
=> Task.FromResult(new TelegramAuthResultDto(IdlePhase, null));
/// <inheritdoc />
public Task<TelegramAuthResultDto> StartQrAsync(
Task<TelegramAuthResultDto> ITelegramGateway.StartQrAsync(
int apiId,
string apiHash,
CancellationToken ct)
@@ -39,20 +39,20 @@ public sealed class LocalTelegramGateway : ITelegramGateway
public Task<string> SendPasswordAsync(string password, CancellationToken ct) => Task.FromResult(IdlePhase);
/// <inheritdoc />
public Task LogoutAsync(CancellationToken ct) => Task.CompletedTask;
Task ITelegramGateway.LogoutAsync(CancellationToken ct) => Task.CompletedTask;
/// <inheritdoc />
public Task<IReadOnlyList<TelegramDialogEntryDto>> RefreshDialogsAsync(CancellationToken ct)
Task<IReadOnlyList<TelegramDialogEntryDto>> ITelegramGateway.RefreshDialogsAsync(CancellationToken ct)
=> Task.FromResult<IReadOnlyList<TelegramDialogEntryDto>>([]);
/// <inheritdoc />
public Task SetMonitorAsync(
Task ITelegramGateway.SetMonitorAsync(
string dialogId,
bool enabled,
CancellationToken ct) => Task.CompletedTask;
/// <inheritdoc />
public Task SetMonitorAllAsync(bool enabled, CancellationToken ct) => Task.CompletedTask;
Task ITelegramGateway.SetMonitorAllAsync(bool enabled, CancellationToken ct) => Task.CompletedTask;
/// <inheritdoc />
public Task<int> BackfillAsync(
@@ -61,40 +61,40 @@ public sealed class LocalTelegramGateway : ITelegramGateway
CancellationToken ct) => Task.FromResult(0);
/// <inheritdoc />
public Task<IReadOnlyList<TelegramRecentMessageDto>> ReadRecentAsync(
Task<IReadOnlyList<TelegramRecentMessageDto>> ITelegramGateway.ReadRecentAsync(
string dialogId,
int limit,
CancellationToken ct)
=> Task.FromResult<IReadOnlyList<TelegramRecentMessageDto>>([]);
/// <inheritdoc />
public Task<TelegramSourceContentDto> ReadSourceAsync(
Task<TelegramSourceContentDto> ITelegramGateway.ReadSourceAsync(
string dialogId,
long msgId,
CancellationToken ct)
=> Task.FromResult(new TelegramSourceContentDto(false, null, null));
/// <inheritdoc />
public Task<IReadOnlyList<TelegramDialogEntryDto>> SearchAsync(
Task<IReadOnlyList<TelegramDialogEntryDto>> ITelegramGateway.SearchAsync(
string query,
int limit,
CancellationToken ct)
=> Task.FromResult<IReadOnlyList<TelegramDialogEntryDto>>([]);
/// <inheritdoc />
public Task<TelegramChannelInfoDto> InfoAsync(string dialogId, CancellationToken ct)
Task<TelegramChannelInfoDto> ITelegramGateway.InfoAsync(string dialogId, CancellationToken ct)
=> Task.FromResult(new TelegramChannelInfoDto(dialogId, string.Empty, string.Empty, string.Empty, SourceDefaults.DefaultHue, null, false));
/// <inheritdoc />
public Task<TelegramEvalReadDto> ReadForEvalAsync(
Task<TelegramEvalReadDto> ITelegramGateway.ReadForEvalAsync(
string dialogId,
int limit,
CancellationToken ct)
=> Task.FromResult(new TelegramEvalReadDto(false, "no_history", []));
/// <inheritdoc />
public Task JoinAsync(string username, CancellationToken ct) => Task.CompletedTask;
Task ITelegramGateway.JoinAsync(string username, CancellationToken ct) => Task.CompletedTask;
/// <inheritdoc />
public Task LeaveAsync(string dialogId, CancellationToken ct) => Task.CompletedTask;
Task ITelegramGateway.LeaveAsync(string dialogId, CancellationToken ct) => Task.CompletedTask;
}