ylliX - Online Advertising Network
Vertex AI - Antrophic and Mistral models: Why does it require Imegen access?

Maintaining State in Blazor Server Application


I have a Blazor server application in which I have a service registered to maintain state as follows:


    public class AppState
    {
        
        public bool IsAuthenticated { get; set; }
        public string UserId { get; set; }
    }

In program.cs

    builder.Services.AddScoped<AppState>();

In Index.razor in OnInitialized() I set some value in AppState:


    @inject AppState AppState
    protected override void OnInitialized()
    {
      AppState.UserId = "logged in userid";
    }

I inject this service in components to grab whatever is required from the scoped service.

However, if I do this in a DataService.cs (which is also scoped) and create an instance of ApplicationDbContext:


    public class DataService
    {
      private IServiceScopeFactory _scopeFactory;
      private AppState _appState;
      public DataService(IServicesScopeFactory scopeFactory, AppState appState)
      {
         _scopeFactory = scopeFactory;
         _appState = appState;
      } 
      
      public async Task<List<Patient>> GetAllPatientsAsync()
      {
        List<Patient> patients = new List<Patient>();
        using (var scope = _scopeFactory.CreateScope())
        {
            var context = 
            scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
            
            //access the ApplicationDbContext
        }
        return patients;
      }
    
        public class ApplicationDbContext : IdentityDbContext
        {
            public Guid _tenantId;
            AppState _state;
            public ApplicationDbContext(DbContextOptions<ApplicationDbContext> 
                 options, ITenantProvider _tenantProvider, AppState appState)
                : base(options)
            {
                _tenantId = _tenantProvider.GetTenantId();
                _state = appState; //seems a new instance of AppState is provided 
                                                           here...
            }

It seems that AppState is reintialized (inside the newly created ApplicationDbContext) and I do not get the value of userId that I set in Index.razor. It appears to me that when I use ScopeFactory, to create a scope and call ApplicationDbContext from that scope, a new scoped instance of AppState is created.

What is the solution to this? I need the original AppState maintained.



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *