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

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

Сообщение Anonymous »

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

Применить глобальные фильтры запросов на объектах < /li>
Реализовать «Измененную» логику, где идентификатор пользователя обновляется на запись после каждой записи. на пути DI-Scope и EF-регистрация теперь выполняются. Я подозреваю, что это является основной причиной. Я могу исправить ошибку, но для этого мне нужно удалить 1) и 2) выше, что я действительно хотел бы Aovid. < /P>
Вот мои рассуждения и то, что я сделал до сих пор: < /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 Layer Ontop EF.  Модель и схема отображаются в GraphQL Nitro Explorer.public partial class Query
{
public IQueryable GetAnimals(DataContext ctx) => ctx.Animals;
}
< /code>
query {
animals {
id
}
}
< /code>
Выполнение этого запроса теперь приводит к ошибке {«ошибки»: [{«Сообщение»: «Неожиданная ошибка выполнения», «Локации»: [{"Line": 2, "столбец ": 3}]," path ": [" Animals "]}]," data ": null} 
Согласно официальной документации HC, как ef ef Wired Up изменился < /p>

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

builder.Services.AddDbContextFactory(opt =>
{
string dbPath = builder.Configuration.GetRequiredValue("dbPath");
opt.UseSqlite($"Data Source={dbPath}");
});

//...

builder.Services.AddGraphQLServer().RegisterDbContextFactory();
< /code>
Выполнение той же верности, а затем дает эту ошибку {«ошибки»: [{«Сообщение»: «Неожиданная ошибка выполнения», «Локации»: [{"line": 2, "столбец" : 3}], «Путь»: ["Животные"], "Расширения": {"Сообщение": "не может разрешить Scoped Service 'IRequestIdentity' от root Provider.", "Stacktrace": "..."}}], "data": null} 
afaik, dbcontextfactor . Но я теряю свои требования 1) и 2) выше. В то время как я мог компенсировать 1), просто добавив дополнительный. Где () фильтры в запрос, я понятия не имею, как я мог бы объяснить 2), не вводя что -то в DBSET. < /p>
У вас есть идея, как я могу заставить эту работу? Ваши мысли об этом и любые отзывы действительно ценится!

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

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

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

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

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

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

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