| name | abp-infrastructure |
| description | ABP infrastructure services - ISettingProvider, IFeatureChecker, IDistributedCache, ILocalEventBus, IDistributedEventBus, IBackgroundJobManager, localization resource. Use when working with settings, feature flags, caching, event bus, or background jobs in ABP. |
ABP Infrastructure Services
Docs: https://abp.io/docs/latest/framework/infrastructure
Settings
Define Settings
public class MySettingDefinitionProvider : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context)
{
context.Add(
new SettingDefinition("MyApp.MaxItemCount", "10"),
new SettingDefinition("MyApp.EnableFeature", "false"),
new SettingDefinition("MyApp.SecretKey", isEncrypted: true)
);
}
}
Read Settings
public class MyService : ITransientDependency
{
private readonly ISettingProvider _settingProvider;
public async Task DoSomethingAsync()
{
var maxCount = await _settingProvider.GetAsync<int>("MyApp.MaxItemCount");
var isEnabled = await _settingProvider.IsTrueAsync("MyApp.EnableFeature");
}
}
Setting Value Providers (Priority Order)
- User settings (highest)
- Tenant settings
- Global settings
- Configuration (appsettings.json)
- Default value (lowest)
Features
Define Features
public class MyFeatureDefinitionProvider : FeatureDefinitionProvider
{
public override void Define(IFeatureDefinitionContext context)
{
var myGroup = context.AddGroup("MyApp");
myGroup.AddFeature(
"MyApp.PdfReporting",
defaultValue: "false",
valueType: new ToggleStringValueType()
);
myGroup.AddFeature(
"MyApp.MaxProductCount",
defaultValue: "10",
valueType: new FreeTextStringValueType(new NumericValueValidator(1, 1000))
);
}
}
Check Features
[RequiresFeature("MyApp.PdfReporting")]
public async Task<PdfReportDto> GetPdfReportAsync()
{
}
if (await _featureChecker.IsEnabledAsync("MyApp.PdfReporting"))
{
}
var maxCount = await _featureChecker.GetAsync<int>("MyApp.MaxProductCount");
Distributed Caching
Typed Cache
public class BookService : ITransientDependency
{
private readonly IDistributedCache<BookCacheItem> _cache;
private readonly IClock _clock;
public BookService(IDistributedCache<BookCacheItem> cache, IClock clock)
{
_cache = cache;
_clock = clock;
}
public async Task<BookCacheItem> GetAsync(Guid bookId)
{
return await _cache.GetOrAddAsync(
bookId.ToString(),
async () => await GetBookFromDatabaseAsync(bookId),
() => new DistributedCacheEntryOptions
{
AbsoluteExpiration = _clock.Now.AddHours(1)
}
);
}
}
[CacheName("Books")]
public class BookCacheItem
{
public string Name { get; set; }
public decimal Price { get; set; }
}
Event Bus
Local Events (Same Process)
public class OrderCreatedEvent
{
public Order Order { get; set; }
}
public class OrderCreatedEventHandler : ILocalEventHandler<OrderCreatedEvent>, ITransientDependency
{
public async Task HandleEventAsync(OrderCreatedEvent eventData)
{
}
}
await _localEventBus.PublishAsync(new OrderCreatedEvent { Order = order });
Distributed Events (Cross-Service)
[EventName("MyApp.Order.Created")]
public class OrderCreatedEto
{
public Guid OrderId { get; set; }
public string OrderNumber { get; set; }
}
public class OrderCreatedEtoHandler : IDistributedEventHandler<OrderCreatedEto>, ITransientDependency
{
public async Task HandleEventAsync(OrderCreatedEto eventData)
{
}
}
await _distributedEventBus.PublishAsync(new OrderCreatedEto { ... });
When to Use Which
- Local: Within same module/bounded context
- Distributed: Cross-module or microservice communication
Background Jobs
Define Job
public class EmailSendingArgs
{
public string EmailAddress { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
public class EmailSendingJob : AsyncBackgroundJob<EmailSendingArgs>, ITransientDependency
{
private readonly IEmailSender _emailSender;
public EmailSendingJob(IEmailSender emailSender)
{
_emailSender = emailSender;
}
public override async Task ExecuteAsync(EmailSendingArgs args)
{
await _emailSender.SendAsync(args.EmailAddress, args.Subject, args.Body);
}
}
Enqueue Job
await _backgroundJobManager.EnqueueAsync(
new EmailSendingArgs
{
EmailAddress = "user@example.com",
Subject = "Hello",
Body = "..."
},
delay: TimeSpan.FromMinutes(5)
);
Localization
Define Resource
[LocalizationResourceName("MyModule")]
public class MyModuleResource { }
JSON Structure
{
"culture": "en",
"texts": {
"HelloWorld": "Hello World!",
"Menu:Books": "Books"
}
}
Usage
- In
ApplicationService: Use L["Key"] property (already available from base class)
- In other services: Inject
IStringLocalizer<MyResource>
Tip: ABP base classes already provide commonly used services as properties. Check before injecting:
StringLocalizer (L), Clock, CurrentUser, CurrentTenant, GuidGenerator
AuthorizationService, FeatureChecker, DataFilter
LoggerFactory, Logger
- Methods like
CheckPolicyAsync() for authorization checks