JZen.AutoInject
2.0.0
See the version list below for details.
dotnet add package JZen.AutoInject --version 2.0.0
NuGet\Install-Package JZen.AutoInject -Version 2.0.0
<PackageReference Include="JZen.AutoInject" Version="2.0.0" />
<PackageVersion Include="JZen.AutoInject" Version="2.0.0" />
<PackageReference Include="JZen.AutoInject" />
paket add JZen.AutoInject --version 2.0.0
#r "nuget: JZen.AutoInject, 2.0.0"
#:package JZen.AutoInject@2.0.0
#addin nuget:?package=JZen.AutoInject&version=2.0.0
#tool nuget:?package=JZen.AutoInject&version=2.0.0
๐ AutoInject
๐ NEW v2.0: Smart Auto-Registration!
Stop writing constructor injection boilerplate AND manual DI registration! ๐
AutoInject now automatically discovers and registers your dependencies - zero configuration needed!
๐ง Smart Auto-Registration (NEW!)
The future of dependency injection is here! No more manual registration:
// Program.cs - Just this! ๐ฏ
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAutoInject(); // One line setup!
var app = builder.Build();
app.UseAutoInject();
app.Run();
// Your service - Zero configuration needed! โจ
public class UserService : InjectBase
{
[Injectable] private readonly IUserRepository? _repository; // Auto-found!
[Injectable] private readonly IEmailService? _emailService; // Auto-registered!
public async Task CreateUserAsync(string name)
{
var user = new User { Name = name };
await _repository!.SaveAsync(user); // Works automatically!
_emailService!.SendWelcomeEmail(user); // No setup required!
}
}
๐ฏ How Smart Auto-Registration Works:
- ๐ Discovers implementations automatically when needed
- ๐ Registers them as Scoped services on-the-fly
- ๐ Injects dependencies instantly
- ๐ Caches mappings for blazing-fast performance
- ๐งน Manages scoping and disposal automatically
๐ Before vs After:
Before (Manual Hell) | After (Smart Auto-Registration) |
---|---|
50+ lines of registration | 2 lines total |
Manual interface mapping | Automatic discovery |
Assembly scanning setup | Zero configuration |
Startup performance hit | Lazy, on-demand loading |
Maintenance nightmare | Self-maintaining |
๐ Complete Smart Auto-Registration Guide
AutoInject now automatically discovers and registers your dependencies - zero configuration needed!
๐ง Smart Auto-Registration (NEW!)
The old way: Constructor injection hell + Manual registration nightmare ๐ค The future of dependency injection is here! No more manual registration: // Program.cs - Manual registration hell services.AddScoped<IUserRepository, UserRepository>(); services.AddScoped<IEmailService, EmailService>(); services.AddScoped<IPaymentService, PaymentService>(); services.AddScoped<INotificationService, NotificationService>(); services.AddScoped<ICacheService, CacheService>(); // ... 50+ more lines
// Your service - Constructor injection hell```csharp // Program.cs - Just this! ๐ฏ var builder = WebApplication.CreateBuilder(args); builder.Services.AddAutoInject(); // One line setup!
var app = builder.Build(); app.UseAutoInject(); app.Run();
// Your service - Zero configuration needed! โจ public class UserService : InjectBase { [Injectable] private readonly IUserRepository? _repository; // Auto-found! [Injectable] private readonly IEmailService? _emailService; // Auto-registered!
public async Task CreateUserAsync(string name)
{
var user = new User { Name = name };
await _repository!.SaveAsync(user); // Works automatically!
_emailService!.SendWelcomeEmail(user); // No setup required!
}
}
**The AutoInject way:** Zero configuration + Clean code โจ
1. ๐ **Discovers** implementations automatically when needed
2. ๐ **R// Program.cs - Just this!
builder.Services.AddAutoInject();
app.UseAutoInject();
// Your service - Clean and simple3. ๐ **Injects** dependencies instantly
4. ๐ **Caches** mappings for blazing-fast performance
5. ๐งน **Manages** scoping and disposal automatically
**๐ Before vs After:**
| Before (Manual Hell) | After (Smart Auto-Registration) |
|----------------------|----------------------------------|
| 50+ lines of registration | 2 lines total |
| Manual interface mapping | Automatic discovery |
| Assembly scanning setup | Zero configuration |
| Startup performance hit | Lazy, on-demand loading |
| Maintenance nightmare | Self-maintaining |
[๐ Complete Smart Auto-Registration Guide](SMART_AUTO_REGISTRATION.md)
**The AutoInject way:** Zero configuration + Clean code โจ
```csharp
// Program.cs - Just this!
builder.Services.AddAutoInject();
app.UseAutoInject();
// Your service - Clean and simple
public class OrderService : InjectBase
{
[Injectable] private readonly IRepository? _repository;
[Injectable] private readonly IEmailService? _emailService;
[Injectable] private readonly IPaymentService? _paymentService;
[Injectable] private readonly INotificationService? _notificationService;
public async Task ProcessOrderAsync(int orderId)
{
_logger.LogInformation("Processing order {OrderId}", orderId);
await _repository!.SaveAsync(order);
_emailService!.SendConfirmation(order);
}
}
๐ Quick Start
๐ Quick Start
1. Install the Package
dotnet add package JZen.AutoInject
### 2. Configure (Two Lines!)
### 2. Configure (Two Lines!)
```csharp
builder.Services.AddAutoInject(); // ๐ฏ Smart Auto-Registration enabled!
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAutoInject(); // ๐ฏ Smart Auto-Registration enabled!
app.UseAutoInject(); // ๐ Factory configured!
var app = builder.Build();
app.UseAutoInject(); // ๐ Factory configured!
app.Run();
3. Use in Your Classes
[Injectable] private readonly IProductRepository? _repository; // Auto-found!
[Injectable] private readonly ICacheService? _cache; // Auto-registered!
[Injectable] private readonly IProductRepository? _repository; // Auto-found!
[Injectable] private readonly ICacheService? _cache; // Auto-registered!
public async Task<Product> GetProductAsync(int id)
{
_logger.LogInformation("Getting product {Id}", id);
var cached = _cache!.Get<Product>($"product_{id}");
if (cached != null) return cached;
var product = await _repository!.GetByIdAsync(id);
_cache.Set($"product_{id}", product);
return product;
**That's it! No manual registration needed!** ๐}
That's it! No manual registration needed! ๐
๐๏ธ Features
๐ง Smart Auto-Registration (NEW!)
- Zero configuration - Automatically finds implementations
- On-demand discovery - Only registers what you actually use
- Performance optimized - Caches mappings for speed
- Cross-assembly support - Works with any loaded assembly
๐ง Smart Auto-Registration (NEW!)
- Zero configuration - Automatically finds implementations
- On-demand discovery - Only registers what you actually use
- Performance optimized - Caches mappings for speed
l
Clean, readable code
InjectBase: Automatic injection on construction (recommended)
InjectBase: Automatic injection on construction (recommended)
[AutoInject]: Factory-based injection
Manual: Call
Factory.InjectDependencies(this)
Automatic
ILogger
injection viaInjectBase
Automatic
ILogger
injection viaInjectBase
Type-safe logger instances
Zero configuration
โ Scoped Management
- HTTP request scoping
- Automatic disposal
- Thread-safe operations
โ ASP.NET Core Integration
- Works with existing DI container
- Middleware support
โ Backward Compatibility
- Mix with manual registrations
- Existing code keeps working
- Gradual migration support- Controller injection
โ Backward Compatibility
- Mix with manual registrations
- Existing code keeps working
- Gradual migration support
๐ Usage Examples
Basic Service
public class EmailService : InjectBase
{
[Injectable] private readonly IEmailProvider? _provider;
[Injectable] private readonly ITemplateEngine? _templates;
public async Task SendAsync(string to, string subject, string body)
{
_logger.LogInformation("Sending email to {To}", to);
var template = _templates!.Render(body);
await _provider!.SendAsync(to, subject, template);
}
}
Controller Integration
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly UserService _userService = new();
[HttpPost]
public async Task<IActionResult> CreateUser(CreateUserRequest request)
{
var user = await _userService.CreateUserAsync(request.Name);
return Ok(user);
}
}
Background Service
public class OrderProcessingService : BackgroundService, InjectBase
{
[Injectable] private readonly IOrderRepository? _orders;
[Injectable] private readonly IPaymentService? _payments;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var pendingOrders = await _orders!.GetPendingAsync();
foreach (var order in pendingOrders)
{
await _payments!.ProcessAsync(order);
_logger.LogInformation("Processed order {OrderId}", order.Id);
}
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
}
๐ง Advanced Configuration
Mixed Registration
// Program.cs - Mix manual and auto registration
builder.Services.AddAutoInject();
builder.Services.AddScoped<ISpecialService, CustomImplementation>(); // Manual
// Other services will be auto-registered
public class MyService : InjectBase
{
[Injectable] private readonly ISpecialService? _special; // Uses manual registration
[Injectable] private readonly IRegularService? _regular; // Auto-registered
}
Custom Factory Configuration
// For non-web applications
var services = new ServiceCollection();
services.AddLogging();
services.AddAutoInject();
var serviceProvider = services.ConfigureAutoInject();
// Now you can use InjectBase classes
var myService = new MyService();
Manual Injection
public class LegacyClass
{
[Injectable] private readonly IRepository? _repository;
public LegacyClass()
{
Factory.InjectDependencies(this); // Manual injection
}
}
๐ฏ When to Use AutoInject
โ Perfect For:
- Rapid prototyping - Get up and running fast
- Clean architecture - Focus on business logic
- Large applications - Reduce boilerplate significantly
- Convention over configuration - Sensible defaults
โ ๏ธ Consider Alternatives When:
- You need multiple implementations of the same interface
- Complex lifetime management requirements
- Performance-critical applications with strict DI requirements
- You prefer explicit registration for all services
๐ Migration Guide
๐ Upgrading to v2.0 (Smart Auto-Registration)
Old way (v1.x) - Manual registration:
// Program.cs - v1.x
builder.Services.AddInjectBaseClasses(Assembly.GetExecutingAssembly()); // โ Obsolete
New way (v2.0) - Smart Auto-Registration:
// Program.cs - v2.0
builder.Services.AddAutoInject(); // โ
Recommended
app.UseAutoInject();
Benefits of upgrading:
- ๐ 80% less configuration code
- โก Better performance (lazy loading)
- ๐งน Self-maintaining (no manual updates needed)
- ๐ Cross-assembly discovery
- ๐ฏ Zero breaking changes (your existing code works as-is)
โ ๏ธ Obsolete Methods
The following methods are now obsolete and will be removed in v3.0:
// โ Obsolete - Don't use these anymore
services.AddInjectBaseClasses(assembly);
services.AddInjectBaseClasses(assemblies);
services.AddInjectBaseClasses();
Migration is simple:
// Before
services.AddInjectBaseClasses(Assembly.GetExecutingAssembly());
// After
services.AddAutoInject(); // That's it!
๐ Upgrading to v2.0 (Smart Auto-Registration)
Old way (v1.x) - Manual registration:
// Program.cs - v1.x
builder.Services.AddInjectBaseClasses(Assembly.GetExecutingAssembly()); // โ Obsolete
New way (v2.0) - Smart Auto-Registration:
// Program.cs - v2.0
builder.Services.AddAutoInject(); // โ
Recommended
app.UseAutoInject();
Benefits of upgrading:
- ๐ 80% less configuration code
- โก Better performance (lazy loading)
- ๐งน Self-maintaining (no manual updates needed)
- ๐ Cross-assembly discovery
- ๐ฏ Zero breaking changes (your existing code works as-is)
โ ๏ธ Obsolete Methods
The following methods are now obsolete and will be removed in v3.0: // Before - Program.cs (50+ lines)
// โ Obsolete - Don't use these anymore
services.AddInjectBaseClasses(assembly);
// ... dozens more registrationsassemblies);
services.AddInjectBaseClasses();
// After - Program.cs (2 lines)
services.AddAutoInject(); // Replaces all manual registrations!
app.UseAutoInject();
**Migration is simple:**
```csharp
// Before
services.AddInjectBaseClasses(Assembly.GetExecutingAssembly());
// After
services.AddAutoInject(); // That's it!
From Constructor Injection
// Before
public class OrderService
{
private readonly IRepository _repo;
private readonly IEmailService _email;
public OrderService(IRepository repo, IEmailService email)
{
_repo = repo;
_email = email;
}
}
// After
public class OrderService : InjectBase
{
[Injectable] private readonly IRepository? _repo;
[Injectable] private readonly IEmailService? _email;
}
From Manual DI Registration
// Before - Program.cs (50+ lines)
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IEmailService, EmailService>();
services.AddScoped<INotificationService, NotificationService>();
// ... dozens more registrations
// After - Program.cs (2 lines)
services.AddAutoInject(); // Replaces all manual registrations!
app.UseAutoInject();
๐ Performance
- Startup: Minimal overhead, lazy discovery
- Runtime: Cached type mappings for fast resolution
- Memory: Efficient scoping and disposal
- Throughput: Comparable to native DI container
๐ค Contributing
We welcome contributions! Please see our Contributing Guide for details.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- Inspired by the need for cleaner dependency injection in .NET
- Built on top of Microsoft.Extensions.DependencyInjection
- Community feedback and contributions
Made with โค๏ธ for the .NET community
โญ Star this repo if you find it useful!
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Microsoft.AspNetCore.Http.Abstractions (>= 2.3.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
🎉 v2.0.0 - SMART AUTO-REGISTRATION: Revolutionary zero-configuration dependency injection! โจ Automatically discovers and registers dependencies on-demand โจ Cross-assembly implementation discovery โจ Performance-optimized with intelligent caching โจ 80% less configuration code โจ Backward compatible - existing code works unchanged โ ๏ธ AddInjectBaseClasses() methods marked obsolete (use AddAutoInject() instead)