Skip to content

Fast.DependencyInjection

Public members, parameters, returns, and exceptions

Targets: net8.0;net9.0;net10.0.

Contract and constraints

AddDependencyInjection() scans discovered non-abstract IDependency implementations. ITransientDependency, IScopedDependency and ISingletonDependency select their respective lifetimes. IDependency alone does not select a lifetime. Types must appear in MAppContext.EffectiveTypes. Business interfaces are registered when eligible; the concrete type is used when no eligible business interface exists. Multiple interface descriptors do not guarantee the same instance across interfaces. Select one lifetime marker per implementation. Named resolution maps simple type names to actually registered business interfaces; duplicate names are rejected at registration. A singleton must not capture request-scoped services.

Installation and examples

Install the package

bash
dotnet add package Fast.DependencyInjection

Example 1

csharp
using Fast.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Builder;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDependencyInjection();

var app = builder.Build();
app.MapGet("/message", (IMessageFormatter formatter) => formatter.Format("hello"));
app.Run();

public interface IMessageFormatter
{
    string Format(string value);
}

public sealed class MessageFormatter : IMessageFormatter, IScopedDependency
{
    public string Format(string value) => $"[{value}]";
}

Web-host examples belong in a consumer project using Microsoft.NET.Sdk.Web and a supported .NET target. IaaS examples can be used in an ordinary class library. Registration precedes builder.Build(); configure middleware and endpoints before app.Run(). Samples retain their original code and comments. No host, external service, database operation or client generator was run, and these snippets have not been compiled in this update.

Source reference

Named resolution and lifetimes

Name maps belong to each IServiceCollection. Named resolution uses an actually registered primary business interface and shares its singleton/scoped instance; it does not take ownership twice. Distinct interface descriptors still need not share instances. Duplicate simple names and multiple lifetime markers fail registration. Closed generic parameters are retained; string-based open-generic names require explicit closed-interface resolution.