Внедрение Scoped Service в EF Core DBSET в хоткоколалате 15: не может разрешить Scoped Service от корневых поставщиковC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Внедрение Scoped Service в EF Core DBSET в хоткоколалате 15: не может разрешить Scoped Service от корневых поставщиков

Сообщение Anonymous »

Недавно я обновил свой бэкэнд GraphQL Backend с EF Core и Hotchocalt от версии 12.x.x до 15.0.3. Сборка/старт работает нормально. Тем не менее, у меня возникают проблемы с вопросами, потому что ошибка ошибки неожиданной ошибки выполнения . Я использую httpaccessor и извлекаю из него информацию о JWT, и храню ее в службу iRequestidentity . С тех пор это было введено внутри dbcontext , где я делаю две вещи с ним:

Применить глобальные фильтры запросов на объектах
Реализовать «Изменено по логике», где идентификатор пользователя обновляется на запись после каждой записи. < /li>
< /ol>
Был изменение в HC15 в То, как DI Scope и EF Регистрация теперь сделана. Я подозреваю, что это является основной причиной. Я могу исправить ошибку, но для этого мне нужно удалить 1) и 2) выше, чего я действительно хотел бы избежать. < /P>
Вот мои рассуждения и то, что я сделал до сих пор Это соответствующие службы и регистрация DI: < /p>

Код: Выделить всё

public interface IUserResolverService
{
Guid GetUserId();
Guid GetTenantId();
}

public class UserResolverService(IHttpContextAccessor accessor) : IUserResolverService
{
public Guid GetUserId() => // ... get user id from token via accessor
public Guid GetTenantId() => // ...get tenant id from token via accessor
}

public interface IRequestIdentity
{
Guid TenantId { get; init; }
Guid UserId { get; init; }
}

public record RequestIdentity(Guid TenantId, Guid UserId) : IRequestIdentity;

builder.Services.AddScoped();
builder.Services.AddScoped(sp =>
{
var userResolverSvc = sp.GetRequiredService();
return new RequestIdentity(userResolverSvc.GetUserId(), userResolverSvc.GetTenantId());
});
builder.Services.AddDbContext(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});
< /code>
И это моя модель данных EF Core. Обратите внимание на поведение в 1) в методах SaveChanges 
. Обратите внимание также, что я вводит iRequestidentity в CTOR DBSET .

Код: Выделить всё

public record Animal
{
public Guid TenantId { get; set; }
public Guid ChangedBy { get; set; }
[MaxLength(50)] public string Name { get; set; }
}

public class DataContext : DbContext
{
public DbSet Animals { get; init; } = null!;
public readonly IRequestIdentity RequestIdentity;

public DataContext(DbContextOptions options, IRequestIdentity reqId) : base(options)
{
RequestIdentity = reqId;
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(e =>
{
e.ToTable("Animals");
e.HasQueryFilter(a => a.TenantId == RequestIdentity.TenantId);
});
}

public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
// updated ChangedBy property

return base.SaveChanges(acceptAllChangesOnSuccess);
}
}
< /code>
Вот слой Hot Chocolate GraphQL на вершине EF Core.  Модель и схема отображаются в GraphQL Nitro Explorer.public partial class Query
{
public IQueryable GetAnimals(DataContext ctx) => ctx.Animals;
}
< /code>
query {
animals {
id
}
}
< /code>
выполнение этого запроса теперь приводит к ошибке < /p>

{"Ошибки": [
{"Сообщение ":" Неожиданная ошибка выполнения ",

" Локации ": [{" Line ": 2," Column ": 3}],

path": [" животные »] }], "data": null}

Согласно официальной документации HC, способ проникновения EF Core изменилось 
builder.Services.AddDbContextFactory(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});

//...

builder.Services.AddGraphQLServer().RegisterDbContextFactory();
< /code>
Выполнение того же запроса, затем приводит к этой ошибке < /p>

{"Ошибки":

[{«Сообщение»: «Неожиданная ошибка выполнения»,

«Локации»: [{{"Line": 2, "Column": 3}], "path": ["Животные"], "расширения": {"Сообщение": "не может разрешить Scoped Service 'IRequestIdentity' от root Provider.", "Stacktrace": "..."}], "Data": null} 
< /blockquote>
afaik, dbcontextfactory < /code>-синглтон, в котором я пытаюсь получить Scoped-Service который не работает.
==> Если я удалю irequestidentity 
из dbset ctor, запрос успешно возвращается. Но я теряю свои требования 1) и 2) выше. В то время как я мог компенсировать 1), просто добавив дополнительный. Где () фильтры в запрос, я понятия не имею, как я мог бы объяснить 2), не вводя что -то в DBSet < /code>.
У вас есть идея о том, как я могу заставить эту работу? Ваши мысли об этом и любые отзывы действительно ценится!

Подробнее здесь: https://stackoverflow.com/questions/794 ... resolve-sc
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»