Demonstrates how to create static composition roots that don't require instantiation of the composition class.
using Shouldly;
using Pure.DI;
DI.Setup(nameof(Composition))
.Bind().As(Lifetime.PerResolve).To<FileSystem>()
.Bind().To<Configuration>()
.Root<IConfiguration>("GlobalConfiguration", kind: RootKinds.Static);
var configuration = Composition.GlobalConfiguration;
configuration.ShouldBeOfType<Configuration>();
interface IFileSystem;
class FileSystem : IFileSystem;
interface IConfiguration;
class Configuration(IFileSystem fileSystem) : IConfiguration;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 runNote
Static roots are useful when you want to access services without creating a composition instance.
The following partial class will be generated:
partial class Composition
{
public static IConfiguration GlobalConfiguration
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
#if NET9_0_OR_GREATER
var perResolveLock = new Lock();
#else
var perResolveLock = new Object();
#endif
var perResolveFileSystem361 = default(FileSystem);
if (perResolveFileSystem361 is null)
lock (perResolveLock)
if (perResolveFileSystem361 is null)
{
perResolveFileSystem361 = new FileSystem();
}
return new Configuration(perResolveFileSystem361);
}
}
}Class diagram:
---
config:
maxTextSize: 2147483647
maxEdges: 2147483647
class:
hideEmptyMembersBox: true
---
classDiagram
FileSystem --|> IFileSystem
Configuration --|> IConfiguration
Composition ..> Configuration : IConfiguration GlobalConfiguration
Configuration o-- "PerResolve" FileSystem : IFileSystem
namespace Pure.DI.UsageTests.Basics.StaticRootScenario {
class Composition {
<<partial>>
+IConfiguration GlobalConfiguration
}
class Configuration {
<<class>>
+Configuration(IFileSystem fileSystem)
}
class FileSystem {
<<class>>
+FileSystem()
}
class IConfiguration {
<<interface>>
}
class IFileSystem {
<<interface>>
}
}