Ich versuche, Request/Response in MassTransit einzurichten, habe aber Probleme mit der Abhängigkeitsinjektion
Posted: 11 Jan 2025, 10:00
Ich versuche also, eine Anfrage/Antwort in MassTransit einzurichten und habe ein Problem mit der Abhängigkeitsinjektion. Ich habe keine Ahnung, was es ist, aber ich werde den mit dem Problem verknüpften Code bereitstellen.Dies ist der DependencyContainer für den Token-Microservice: derjenige, der eine Antwort vom Benutzer-Microservice anfordert
Die Ausnahme, die ich beim Start erhalte, ist die nächste:
System.AggregateException: 'Einige Dienste können nicht erstellt werden (Fehler beim Überprüfen des Dienstdeskriptors 'ServiceType: Dodis.TokenSer.Application.Interfaces.ITokenService Lifetime: Transient ImplementationType: Dodis .TokenSer.Application.Services.TokenService': Dienst für Typ kann nicht aufgelöst werden 'MassTransit.IRequestClient`1[Dodis.Domain.Core.Messages.Requests.GetUserRequest]' beim Versuch, 'Dodis.TokenSer.Application.Services.TokenService' zu aktivieren.)'
Inner Ausnahme
InvalidOperationException: Fehler beim Validieren des Dienstdeskriptors „ServiceType: Dodis.TokenSer.Application.Interfaces.ITokenService Lebensdauer: Transient ImplementationType: Dodis.TokenSer.Application.Services.TokenService‘: Der Dienst für den Typ „MassTransit.IRequestClient`1[Dodis.Domain.Core.Messages.Requests.GetUserRequest]“ konnte beim Versuch, „Dodis.TokenSer“ zu aktivieren, nicht aufgelöst werden .Application.Services.TokenService'.
Dann haben wir den TokenService, der den Fehler ausgibt.
Dies ist der DependencyContainer des Benutzer-Microservices, der eine Anfrage vom Token-Microservice empfängt und eine Antwort sendet. Ich glaube nicht, dass hier das Problem liegt, aber dennoch teilen
Die Ausnahme, die ich beim Start erhalte, ist die nächste:
System.AggregateException: 'Einige Dienste können nicht erstellt werden (Fehler beim Überprüfen des Dienstdeskriptors 'ServiceType: Dodis.TokenSer.Application.Interfaces.ITokenService Lifetime: Transient ImplementationType: Dodis .TokenSer.Application.Services.TokenService': Dienst für Typ kann nicht aufgelöst werden 'MassTransit.IRequestClient`1[Dodis.Domain.Core.Messages.Requests.GetUserRequest]' beim Versuch, 'Dodis.TokenSer.Application.Services.TokenService' zu aktivieren.)'
Inner Ausnahme
InvalidOperationException: Fehler beim Validieren des Dienstdeskriptors „ServiceType: Dodis.TokenSer.Application.Interfaces.ITokenService Lebensdauer: Transient ImplementationType: Dodis.TokenSer.Application.Services.TokenService‘: Der Dienst für den Typ „MassTransit.IRequestClient`1[Dodis.Domain.Core.Messages.Requests.GetUserRequest]“ konnte beim Versuch, „Dodis.TokenSer“ zu aktivieren, nicht aufgelöst werden .Application.Services.TokenService'.
Code: Select all
public static void RegisterServices(IServiceCollection services, string MicroService, IConfiguration configuration)
{
//services.AddTransient();
var tokenSettings = new TokenSettings();
configuration.Bind("Token", tokenSettings);
services.Configure(configuration.GetSection("Token"));
#region MassTransit
try
{
services.AddMassTransit(config =>
{
config.SetKebabCaseEndpointNameFormatter();
config.AddRequestClient();
config.UsingRabbitMq((context, configurator) =>
{
configurator.Host("localhost", "/", h =>
{
h.Username("guest");
h.Password("guest");
});
configurator.ConfigureEndpoints(context);
});
});
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
#endregion
try
{
services.AddScoped(sp =>
{
var tokenFactory = sp.GetRequiredService();
var tokenRepository = sp.GetRequiredService();
var requestClient = sp.GetRequiredService();
return new TokenService(tokenFactory, tokenRepository, requestClient);
});
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
services.AddDbContext(options =>
{
options.UseSqlServer(hiding this);
});
services.AddScoped();
}
}
}
Code: Select all
public class TokenService : ITokenService
{
private readonly ITokenFactory _tokenFactory;
private readonly ITokenRepository _repository;
private readonly IRequestClient _client;
public TokenService(ITokenFactory tokenFactory, ITokenRepository repository, IRequestClient client)
{
_tokenFactory = tokenFactory;
_repository = repository;
_client = client;
}
public async Task CreateToken(TokenRequest model)
{
var existingToken = await _repository.GetTokenByUserIdAndProvider(model.UserId, "Dodis", "Access_Token");
if (existingToken != null)
{
existingToken.Value = await _tokenFactory.CreateToken(new TokenRequest
{
UserId = model.UserId,
RoleName = model.RoleName,
});
existingToken.ExpireDate = DateTime.UtcNow.AddMinutes(20160);
await _repository.UpdateToken(existingToken);
var response = await _client.GetResponse(new GetUserRequest { Id = model.UserId });
ect...
Code: Select all
public static void RegisterServices(IServiceCollection services, string MicroService, IConfiguration? configuration = null)
{
//Mediatr
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
// MassTransit
try
{
services.AddMassTransit(config =>
{
//// Add the request client
//config.AddRequestClient();
config.SetKebabCaseEndpointNameFormatter();
config.AddConsumer();
config.UsingRabbitMq((context, configurator) =>
{
configurator.Host("rabbitmq://localhost", h =>
{
h.Username("guest");
h.Password("guest");
});
configurator.ConfigureEndpoints(context);
});
});
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}