SharpServiceCollection 0.0.6
dotnet add package SharpServiceCollection --version 0.0.6
NuGet\Install-Package SharpServiceCollection -Version 0.0.6
<PackageReference Include="SharpServiceCollection" Version="0.0.6" />
<PackageVersion Include="SharpServiceCollection" Version="0.0.6" />
<PackageReference Include="SharpServiceCollection" />
paket add SharpServiceCollection --version 0.0.6
#r "nuget: SharpServiceCollection, 0.0.6"
#:package SharpServiceCollection@0.0.6
#addin nuget:?package=SharpServiceCollection&version=0.0.6
#tool nuget:?package=SharpServiceCollection&version=0.0.6
| Branch | Status |
|---|---|
| main |
Installation
To install, run dotnet add package SharpServiceCollection or
from Nuget
Introduction
SharpServiceCollection is a lightweight C# library that wraps the IServiceCollection interface to streamline
dependency injection through attribute-based assembly scanning.
Usage
SharpServiceCollectionscans an assembly to automatically register services in theIServiceCollectioncontainer.Use one of the extension methods of
IServiceCollectionto perform assembly scanning.AddServicesFromCurrentAssembly()AddServicesFromAssembly(Assembly assembly)AddServicesFromAssemblyContaining<T>()AddServicesFromAssemblyContaining(Type type)
Notes:
SharpServiceCollectionwill perform lexicographical sort on the class name to register dependency when duplicates occur. For example,FooBarBazwill be sorted asBarBazFoo, If three of them are resolved byIDemoInterface, NonTry*based attributes will register the last one, which isFoo,Try*based attributes will register the first one, which isBarInstanceLifetimeis an Enum with the valuesSingletonScopedTransient
Unified Attribute Approach
The InjectableDependencyAttribute provides a unified approach to dependency registration with flexible resolution
strategies:
Non-Generic Version
[InjectableDependency(InstanceLifetime lifetime, ResolveBy resolveBy)]
[InjectableDependency(InstanceLifetime lifetime, ResolveBy resolveBy, string key)]
ResolveBy Enum:
Self- Resolves the class by itselfImplementedInterface- Resolves by all implemented interfacesMatchingInterface- Resolves by interface with matching name (e.g.,MyService→IMyService)SelfAndReplace- Same asSelfbut usesAdd*methods (replaces existing)ImplementedInterfaceAndReplace- Same asImplementedInterfacebut usesAdd*methods (replaces existing)MatchingInterfaceAndReplace- Same asMatchingInterfacebut usesAdd*methods (replaces existing)
Generic Version
[InjectableDependency<T>(InstanceLifetime lifetime)]
[InjectableDependency<T>(InstanceLifetime lifetime, bool replace)]
[InjectableDependency<T>(InstanceLifetime lifetime, string key)]
[InjectableDependency<T>(InstanceLifetime lifetime, bool replace, string key)]
Parameters:
replace:falseusesTryAdd*methods,trueusesAdd*methodskey: For keyed services registration
Example with Unified Attribute Approach
public interface IUserService
{
string GetUserInfo(int id);
}
using SharpServiceCollection.Attributes;
using SharpServiceCollection.Enums;
// Non-generic version
[InjectableDependency(InstanceLifetime.Scoped, ResolveBy.ImplementedInterface)]
public class UserService : IUserService
{
public string GetUserInfo(int id) => $"User {id} information";
}
// Generic version
[InjectableDependency<IUserService>(InstanceLifetime.Singleton)]
public class CachedUserService : IUserService
{
public string GetUserInfo(int id) => $"Cached User {id} information";
}
Granular Attribute Approach
IServiceCollectioncomes withAdd*andTryAdd*methods.SharpServiceCollectionoffers the same functionality.- In general, it is better to use
Try*based attributes.
using SharpServiceCollection.Attributes;
using SharpServiceCollection.Enums;
// The class will be resolvable by the interface specified in the generic argument
[TryResolveBy<IScopedDemoService>(InstanceLifetime.Scoped)]
[ResolveBy<IScopedDemoService>(InstanceLifetime.Scoped)]
public class ScopedDemoType : IScopedDemoService, IKeyedScopedDemoService
{
}
// The class will be resolvable by the interface specified in the generic argument and the key
[KeyedTryResolveBy<IKeyedScopedDemoService>(InstanceLifetime.Scoped, "keyed")]
[KeyedResolveBy<IKeyedScopedDemoService>(InstanceLifetime.Scoped, "keyed")]
public class ScopedDemoType : IScopedDemoService, IKeyedScopedDemoService
{
}
// The class will be resolvable by itself
[TryResolveBySelf(InstanceLifetime.Scoped)]
[ResolveBySelf(InstanceLifetime.Scoped)]
public class ScopedDependency : IScopedDependency
{
}
// This will work by convention
// The class must have to implement an interface that has the same name of the class prefixed with I
[TryResolveByMatchingInterface(InstanceLifetime.Scoped)]
[ResolveByMatchingInterface(InstanceLifetime.Scoped)]
public class ScopedDependency : IScopedDependency
{
}
// The class will be resolvable by any of the implementeed interface
[TryResolveByImplementedInterface(InstanceLifetime.Scoped)]
[ResolveByImplementedInterface(InstanceLifetime.Scoped)]
public class FooBarBaz : IFoo, IBar, IBaz
{
}
Example With Granular Attribute Approach
public interface IDemoService
{
string Greet();
}
using SharpServiceCollection.Attributes;
using SharpServiceCollection.Enums;
[TryResolveByImplementedInterface(InstanceLifetime.Scoped)]
public class DemoService : IDemoService
{
public string Greet()
{
return "Hello World!";
}
}
using SharpServiceCollection.Extensions;
var builder = WebApplication.CreateBuilder(args);
// Current assembly will be scanned by Assembly.GetCallingAssembly()
builder.Services.AddServicesFromCurrentAssembly();
var app = builder.Build();
app.MapGet("/", (IDemoService demoService) => demoService.Greet());
app.Run();
| 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
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.