Install
$ agentstack add skill-burakdmir-abp-skills-abp-infrastructure ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
ABP Framework — Infrastructure
ABP Framework v10.4 infrastructure components. Event Bus, Background Jobs, Caching, BLOB Storing, Emailing, Data Filtering, Data Seeding, Settings, Features, Virtual File System, Entity Cache, Distributed Locking.
Trigger
- "ABP event bus"
- "ABP background job"
- "ABP cache"
- "ABP Redis"
- "ABP BLOB"
- "ABP email"
- "ABP data filter"
- "ABP data seeding"
- "ABP settings"
- "ABP features"
- "ABP virtual file"
- "ABP entity cache"
- "ABP distributed lock"
- "ABP current user"
- "ABP infrastructure"
Event Bus
| Type | Interface | Usage | |---|---|---| | Local | ILocalEventBus, ILocalEventHandler | Same process | | Distributed | IDistributedEventBus, IDistributedEventHandler | Across processes |
// Event
public class StockCountChangedEvent { public Guid ProductId { get; set; } public int NewCount { get; set; } }
// Publish (service)
await _localEventBus.PublishAsync(new StockCountChangedEvent { ProductId = id, NewCount = count });
// Publish (entity)
public class Product : AggregateRoot
{
public void ChangeStock(int count) { StockCount = count; AddLocalEvent(new StockCountChangedEvent { ... }); }
}
// Handler
public class Handler : ILocalEventHandler, ITransientDependency
{
[UnitOfWork]
public virtual async Task HandleEventAsync(StockCountChangedEvent e) { /* logic */ }
}
Distributed Providers: Local (default), RabbitMQ, Kafka, Azure Service Bus, Rebus
Rule: Microservice → Distributed, Modular Monolith → Distributed (inter-module), Monolith → Local
Background Jobs
public class EmailSendingArgs { public string Email { get; set; } public string Subject { get; set; } public string Body { get; set; } }
public class EmailSendingJob : AsyncBackgroundJob, ITransientDependency
{
private readonly IEmailSender _emailSender;
public EmailSendingJob(IEmailSender emailSender) => _emailSender = emailSender;
public override async Task ExecuteAsync(EmailSendingArgs args) =>
await _emailSender.SendAsync(args.Email, args.Subject, args.Body);
}
// Enqueue
await _backgroundJobManager.EnqueueAsync(new EmailSendingArgs { ... }, priority: BackgroundJobPriority.Normal, delay: TimeSpan.FromMinutes(5));
Providers: Default (in-memory/DB), Hangfire, Quartz, RabbitMQ
Caching
[CacheName("Books")]
public class BookCacheItem { public string Name { get; set; } public float Price { get; set; } }
public class BookService : ITransientDependency
{
private readonly IDistributedCache _cache;
public BookService(IDistributedCache cache) => _cache = cache;
public async Task GetAsync(Guid id) =>
await _cache.GetOrAddAsync(id, async () => await GetFromDbAsync(id),
() => new DistributedCacheEntryOptions { AbsoluteExpiration = DateTimeOffset.Now.AddHours(1) });
}
Redis: abp add-package Volo.Abp.Caching.StackExchangeRedis
"Redis": { "IsEnabled": "true", "Configuration": "127.0.0.1" }
Why the ABP Redis package? Has SetManyAsync/GetManyAsync (not in Microsoft's), simple configuration.
Batch: GetManyAsync, SetManyAsync, GetOrAddManyAsync, RemoveManyAsync
UOW-level: await _cache.SetAsync(key, value, considerUow: true)
BLOB Storing
[BlobContainerName("product-images")]
public class ProductImageBlobContainer : AbpBlobContainer { }
// Usage
await _blobContainer.SaveAsync(productId.ToString(), imageBytes, true);
var bytes = await _blobContainer.GetAllAsync(productId.ToString());
Providers: FileSystem, Database, AWS S3, Azure, MinIO, Google, Alibaba, Bunny, Memory
Emailing
await _emailSender.SendAsync(to: email, subject: "Welcome!", body: "...", isBodyHtml: true);
Data Filtering
using (_dataFilter.Disable()) { return await _repository.GetListAsync(); }
using (_dataFilter.Disable()) { return await _repository.GetCountAsync(); }
Data Seeding
public class MyDataSeedContributor : IDataSeedContributor, ITransientDependency
{
public async Task SeedAsync(DataSeedContext context)
{
if (await _roleRepository.FindAsync(x => x.Name == "Admin") == null)
await _roleRepository.InsertAsync(new IdentityRole(GuidGenerator.Create(), "Admin"));
}
}
Settings
public class MyAppSettings : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context) =>
context.Add(new SettingDefinition("MyApp.MaxPrice", defaultValue: "1000", isVisibleToClients: true));
}
// Usage
var max = await _settingProvider.GetOrNullAsync("MyApp.MaxPrice");
await SettingManager.SetAsync("MyApp.MaxPrice", "2000");
Features
public class MyAppFeatures : FeatureDefinitionProvider
{
public override void Define(IFeatureDefinitionContext context) =>
context.Add(new FeatureDefinition("MyApp.Premium", defaultValue: "false"));
}
// Usage
var enabled = await _featureChecker.IsEnabledAsync("MyApp.Premium");
Virtual File System
Configure(options => options.FileSets.AddEmbedded());
Current User
var userId = CurrentUser.Id;
var userName = CurrentUser.UserName;
var tenantId = CurrentUser.TenantId;
var roles = CurrentUser.Roles;
var isAuthenticated = CurrentUser.IsAuthenticated;
Distributed Locking
await using var handle = await _distributedLock.TryAcquireAsync("my-lock-key");
if (handle != null) { /* critical operation */ }
Best Practices
- Publish events from the entity, handle them in the service
- Move long-running work to a background job
- Use
GetOrAddAsync, set expiration - Use the BLOB provider abstraction
- Disable the data filter with
using - Settings for runtime-changeable values
- Features for per-tenant toggles
Related
[DDD](../abp-ddd/SKILL.md) · [Microservices](../abp-microservices/SKILL.md) · [Deployment](../abp-deployment/SKILL.md) · [Settings & Features](../abp-settings-features/SKILL.md) · Docs: https://abp.io/docs/latest/framework/infrastructure
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: burakdmir
- Source: burakdmir/abp-skills
- License: MIT
- Homepage: https://abp.io/docs/latest
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.