RootName provides the name of the composition root being resolved. This property is useful for logging, diagnostics, or implementing root-specific behavior.
Use this when infrastructure behavior should include root-level context (for example, logging prefixes).
using Shouldly;
using Pure.DI;
var composition = new Composition();
var orderService = composition.OrderService;
orderService.Logger.Log("Processing order").ShouldContain("OrderService");
var paymentService = composition.PaymentService;
paymentService.Logger.Log("Processing payment").ShouldContain("PaymentService");
interface ILogger
{
string Log(string message);
}
interface IOrderService
{
ILogger Logger { get; }
}
interface IPaymentService
{
ILogger Logger { get; }
}
class Logger(string rootName) : ILogger
{
public string Log(string message) => $"[{rootName}] {message}";
}
class OrderService(ILogger logger) : IOrderService
{
public ILogger Logger => logger;
}
class PaymentService(ILogger logger) : IPaymentService
{
public ILogger Logger => logger;
}
partial class Composition
{
private void Setup() =>
DI.Setup(nameof(Composition))
.Bind().To(ctx => new Logger(ctx.RootName))
.Bind().To<OrderService>()
.Root<IOrderService>("OrderService")
.Bind().To<PaymentService>()
.Root<IPaymentService>("PaymentService");
}Running this code sample locally
- Make sure you have the .NET SDK 10.0 or later installed
dotnet --list-sdk- Create a net10.0 (or later) console application
dotnet new console -n Sampledotnet add package Pure.DI
dotnet add package Shouldly- Copy the example code into the Program.cs file
You are ready to run the example 🚀
dotnet runLimitations: root-name-dependent behavior couples logic to API naming; avoid it in domain services. See also: Composition roots, Root Type.
The following partial class will be generated:
partial class Composition
{
public IOrderService OrderService
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
Logger transientLogger97 = new Logger("OrderService");
return new OrderService(transientLogger97);
}
}
public IPaymentService PaymentService
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
Logger transientLogger95 = new Logger("PaymentService");
return new PaymentService(transientLogger95);
}
}
}Class diagram:
---
config:
maxTextSize: 2147483647
maxEdges: 2147483647
class:
hideEmptyMembersBox: true
---
classDiagram
Logger --|> ILogger
OrderService --|> IOrderService
PaymentService --|> IPaymentService
Composition ..> PaymentService : IPaymentService PaymentService
Composition ..> OrderService : IOrderService OrderService
OrderService *-- Logger : ILogger
PaymentService *-- Logger : ILogger
namespace Pure.DI.UsageTests.Advanced.RootNameScenario {
class Composition {
<<partial>>
+IOrderService OrderService
+IPaymentService PaymentService
}
class ILogger {
<<interface>>
}
class IOrderService {
<<interface>>
}
class IPaymentService {
<<interface>>
}
class Logger {
<<class>>
}
class OrderService {
<<class>>
+OrderService(ILogger logger)
}
class PaymentService {
<<class>>
+PaymentService(ILogger logger)
}
}