Ling.AutoInject
1.1.0
dotnet add package Ling.AutoInject --version 1.1.0
NuGet\Install-Package Ling.AutoInject -Version 1.1.0
<PackageReference Include="Ling.AutoInject" Version="1.1.0"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
<PackageVersion Include="Ling.AutoInject" Version="1.1.0" />
<PackageReference Include="Ling.AutoInject"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> </PackageReference>
paket add Ling.AutoInject --version 1.1.0
#r "nuget: Ling.AutoInject, 1.1.0"
#:package Ling.AutoInject@1.1.0
#addin nuget:?package=Ling.AutoInject&version=1.1.0
#tool nuget:?package=Ling.AutoInject&version=1.1.0
Ling.AutoInject
Ling.AutoInject provides attribute-driven registration helpers and integrates with a source generator to emit IServiceCollection extension methods that register services discovered via attributes at compile time.
Features
- Attributes:
SingletonService,ScopedService,TransientServicefor simple, declarative registration. - Optional service typing and keyed registration support.
- Configurable generated method name, host class and namespace through an assembly-level
AutoInjectConfigattribute. - Service replacement: use
Replace = trueto replace existing registrations instead of skipping when a service is already registered. - Class-level customization via
AutoInjectExtensionsAttributefor control over method generation behavior, including optionalIConfigurationparameter support. - Complementary analyzers to surface common mistakes and invalid configurations in the IDE.
Installation
via .NET CLI:
dotnet add package Ling.AutoInject
via Package Manager Console:
Install-Package Ling.AutoInject
Usage
Decorate implementation types:
using Ling.AutoInject; [SingletonService] public class MyService { } [ScopedService(typeof(IFoo))] public class MyService : IFoo { } [TransientService(ServiceKey = "k1")] public class MyService { }(Optional) Configure generator output naming:
[assembly: Ling.AutoInject.AutoInjectConfig( MethodName = "AddCustomServices", ClassName = "ServiceExtensions", Namespace = "MyNamespace")]Call the generated extension in
Program/Startup:services.Add[MyAssembly]Services(); // or services.AddCustomServices();
Notes
- If no service type is specified, the implementation type is registered as itself.
- If a service type is specified, the generator registers the mapping from service interface to implementation.
- Keyed registration requires the DI Abstractions package to support keyed APIs; analyzers warn when unsupported.
Advanced features
Replace existing registrations
Use the Replace property to replace existing service registrations instead of using TryAdd methods:
[SingletonService(typeof(IFoo), Replace = true)]
public class MyService : IFoo { }
This generates services.Replace(ServiceDescriptor.Singleton<IFoo, MyService>()) instead of services.TryAddSingleton<IFoo, MyService>().
Using AutoInjectExtensionsAttribute
Instead of using the assembly-level AutoInjectConfig, you can decorate a static partial class with AutoInjectExtensionsAttribute for more control:
using Ling.AutoInject;
namespace MyNamespace
{
[AutoInjectExtensions(MethodName = "AddCustomServices")]
public static partial class MyServiceExtensions { }
}
This generates a partial class with the specified method name in the same namespace as the decorated class.
Including IConfiguration
Use IncludeConfiguration = true to generate a method that accepts an IConfiguration parameter:
[AutoInjectExtensions(MethodName = "AddCustomServices", IncludeConfiguration = true)]
public static partial class MyServiceExtensions { }
This generates:
public static IServiceCollection AddCustomServices(this IServiceCollection services, IConfiguration configuration)
{
// ...
AddAdditionalServices(services, configuration);
return services;
}
static partial void AddAdditionalServices(IServiceCollection services, IConfiguration configuration);
You can implement the AddAdditionalServices partial method to add custom service registrations that require configuration.
Planned features
- Options binding: future work will add attribute-driven registration and configuration binding for options classes (
IOptions<T>), including section binding.
Contributing
- PRs and issues welcome. Include tests for analyzer/generator changes.
License
- MIT License.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. 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 is compatible. 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 is compatible. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
-
.NETStandard 2.0
-
.NETStandard 2.1
-
net10.0
-
net5.0
-
net6.0
-
net7.0
-
net8.0
-
net9.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.