- ABP Framework version: v4.3.0-rc.2
- UI type: Blazor
- DB provider: EF Core
Hi,
I have a backgroundJob method where I need to check if the Tenant Edition Feature is checked or not. The method does a loop in a table disabling IMultiTenant filter. And then, for each record, it sets the CurrentTenant using the method Change().
The problem is that the Features are not returning properly. For example, if one Editon has the feature Trial checked, it is returning false anyway.
I have tried to create a new instance for FeatureChecker after changing the tenant, but it is still not working.
What should I do to be able to change the tenant and get the features properly?
If I am logged as Tenant and check that in a Blazor page, that works fine. It means that my settings are right.
Another question, it seems that ServiceProvider is obsolete now and it suggests using LazyServiceProvider instead. But, how can I create an instance and release/dispose it properly? It doesn't have CreateScope() method.
I have researched in the documentation, but no success so far for my questions.
Bellow my code for reference:
public async Task RunNotificationCheck()
{
List<SupplyNetwork> networks;
using (_dataFilter.Disable<IMultiTenant>())
{
networks = _supplyNetworkRepository.Where(x => x.Active).ToList();
}
foreach (var network in networks)
{
await CheckSupplyNetworkNotifications(network);
}
}
private async Task CheckSupplyNetworkNotifications(SupplyNetwork supplyNetwork)
{
using (CurrentTenant.Change(supplyNetwork.TenantId))
{
using (var scope = ServiceProvider.CreateScope())
{
_featureChecker = ServiceProvider.GetRequiredService<IFeatureChecker>();
var trial = await _featureChecker.IsEnabledAsync(AvalancheOCPFeatures.Trial);
if (!trial)
{
var txtAlertEnabled = !await _featureChecker.IsEnabledAsync(AvalancheOCPFeatures.TXTAlerts);
var emailAlertEnabled = !await _featureChecker.IsEnabledAsync(AvalancheOCPFeatures.EmailAlerts);
var desktopAlertEnabled = !await _featureChecker.IsEnabledAsync(AvalancheOCPFeatures.DesktopAlerts);
if (supplyNetwork.EnableEmailNotification && emailAlertEnabled)
{
await CheckTenantEmailNotifications(supplyNetwork);
}
if (supplyNetwork.EnableTXTNotification && txtAlertEnabled)
{
await CheckTenantTXTNotifications(supplyNetwork);
}
if (supplyNetwork.EnableAlertNotification && desktopAlertEnabled)
{
await CheckTenantAlertNotifications(supplyNetwork);
}
}
}
}
}
5 Answer(s)
-
0
-
0
Hi @maliming,
Sorry, your answer it not 100% clear for me. I don't have the Volo.Abp.Features source code in my project, only the package reference for it. I haven't found that peace of code as your image. Where exactly do you want me to check if there is EditionId assigned or not? Besides, the instance for CurrentTenant doesn't have the field EditionId.
-
1
hi
You can inject the
ICurrentPrincipalAccessor
service. then check its claims.PrincipalAccessor.Principal?.FindEditionId()
If there is noEditionId
claims, you shuoldCurrentPrincipalAccessor.Change
to set is as tenant'sEditionId
.using (CurrentPrincipalAccessor.Change(new Claim(AbpClaimTypes.EditionId, currentTenant.EditionId))) { }
-
0
That worked, thank you! Do you have the reference for the documentation of that? PrincipalAncessor and Claims?
-
0
These components are not commonly used, and there is no documentation yet.