Skip to content

Latest commit

 

History

History
164 lines (140 loc) · 3.64 KB

File metadata and controls

164 lines (140 loc) · 3.64 KB

Root Name

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
dotnet --list-sdk
  • Create a net10.0 (or later) console application
dotnet new console -n Sample
dotnet 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 run

Limitations: 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)
		}
	}
Loading