SimpleViewModel 0.9.0
See the version list below for details.
Requires NuGet 4.1.0 or higher.
dotnet add package SimpleViewModel --version 0.9.0
NuGet\Install-Package SimpleViewModel -Version 0.9.0
<PackageReference Include="SimpleViewModel" Version="0.9.0" />
<PackageVersion Include="SimpleViewModel" Version="0.9.0" />
<PackageReference Include="SimpleViewModel" />
paket add SimpleViewModel --version 0.9.0
#r "nuget: SimpleViewModel, 0.9.0"
#addin nuget:?package=SimpleViewModel&version=0.9.0
#tool nuget:?package=SimpleViewModel&version=0.9.0
SimpleInjection
A lightweight dependency injection library for C# that combines simple DI container functionality with powerful source generation for content management.
Features
🚀 Simple Dependency Injection
- Attribute-based registration - Mark classes with
[Singleton]
,[Scoped]
, or[Transient]
- Automatic service discovery - No manual registration required
- Constructor injection - Automatic dependency resolution
- Scope management - Built-in scoped service lifetime management
⚡ Content Source Generation
- Automatic enum generation - Creates enums from your content collections
- Type-safe access - Generated helper methods for accessing content by enum or index
- Performance optimized - Uses
NamedComparer<T>
for fast dictionary lookups - Roslyn analyzers - Enforces best practices and catches common mistakes
Quick Start
1. Install the Package
dotnet add package SimpleInjection
2. Dependency Injection Usage
Mark your classes with lifetime attributes:
[Singleton]
public class DatabaseService
{
public void Connect() => Console.WriteLine("Connected to database");
}
[Scoped]
public class UserService
{
private readonly DatabaseService _database;
public UserService(DatabaseService database)
{
_database = database;
}
public void GetUser() => _database.Connect();
}
Initialize and use the host:
var host = Host.Initialize();
// Get singleton services directly
var dbService = host.Get<DatabaseService>();
// Create scopes for scoped services
using var scope = host.CreateScope();
var userService = scope.Get<UserService>();
3. Content Generation Usage
Define your content classes:
// Your content item must implement INamed
public record Material(string Name, string Color, int Durability) : INamed;
// Your content collection must implement IContent<T>
[Singleton]
public partial class Materials : IContent<Material>
{
public Material[] All { get; } =
[
new("Steel", "Gray", 100),
new("Wood", "Brown", 50),
new("Gold", "Yellow", 25)
];
}
The source generator automatically creates:
// Generated enum
public enum MaterialsType
{
Steel,
Wood,
Gold
}
// Generated helper methods
public partial class Materials
{
public Material Get(MaterialsType type) => All[(int)type];
public Material this[MaterialsType type] => All[(int)type];
public Material GetById(int id) => All[id];
public Material Steel => All[0];
public Material Wood => All[1];
public Material Gold => All[2];
}
Use the generated code:
var materials = host.Get<Materials>();
// Type-safe access using enums
var steel = materials[MaterialsType.Steel];
var wood = materials.Get(MaterialsType.Wood);
// Direct property access
var gold = materials.Gold;
// Index-based access
var firstMaterial = materials.GetById(0);
Advanced Features
Performance Optimizations
The library includes NamedComparer<T>
for efficient dictionary operations with INamed
keys:
// Use ToNamedDictionary extension method
var materialDict = materials.All.ToNamedDictionary(m => m.Durability);
// Or explicitly specify the comparer
var dict = new Dictionary<Material, int>(new NamedComparer<Material>());
SubContent Collections
For hierarchical content organization:
public class WeaponStats : ISubContent<Material, int>
{
public Dictionary<Material, int> ByKey { get; }
public int this[Material material] => ByKey[material];
}
Roslyn Analyzers
The package includes analyzers that help you:
- NC001: Ensures
Dictionary<TKey, TValue>
usesNamedComparer<T>
forINamed
keys - TND001: Suggests using
ToNamedDictionary()
instead ofToDictionary()
forINamed
keys
Requirements
- .NET 8.0 or .NET 9.0
- C# with nullable reference types enabled (recommended)
How It Works
- Service Discovery: The host scans all loaded assemblies for classes marked with lifetime attributes
- Dependency Resolution: Constructor parameters are automatically resolved from registered services
- Source Generation: The generator scans for classes implementing
IContent<T>
and generates enums and helper methods - Code Analysis: Roslyn analyzers ensure best practices for dictionary usage with named keys
Best Practices
- Use
[Singleton]
for stateless services and shared resources - Use
[Scoped]
for services that should be unique per operation/request - Use
[Transient]
for lightweight, stateless services that need fresh instances - Always implement
INamed
for content objects to enable source generation - Use the generated enums for type-safe content access
- Leverage
ToNamedDictionary()
for performance when working withINamed
collections
License
MIT License - see the license file for details.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0-windows7.0 is compatible. net9.0-windows was computed. net9.0-windows7.0 is compatible. net10.0-windows was computed. |
-
net8.0-windows7.0
- No dependencies.
-
net9.0-windows7.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
0.9.7.4 | 89 | 6/27/2025 |
0.9.7.3 | 86 | 6/27/2025 |
0.9.7.2 | 85 | 6/27/2025 |
0.9.7.1 | 135 | 6/18/2025 |
0.9.7 | 129 | 6/17/2025 |
0.9.6.4 | 135 | 6/17/2025 |
0.9.6.3 | 129 | 6/17/2025 |
0.9.6.2 | 130 | 6/17/2025 |
0.9.6.1 | 131 | 6/17/2025 |
0.9.6 | 132 | 6/17/2025 |
0.9.5.4 | 127 | 6/17/2025 |
0.9.5.3 | 126 | 6/17/2025 |
0.9.5.2 | 130 | 6/17/2025 |
0.9.5.1 | 133 | 6/16/2025 |
0.9.5 | 129 | 6/16/2025 |
0.9.4 | 132 | 6/16/2025 |
0.9.3 | 131 | 6/16/2025 |
0.9.2 | 132 | 6/16/2025 |
0.9.1 | 127 | 6/16/2025 |
0.9.0 | 129 | 6/16/2025 |