using Shouldly;
using Pure.DI;
using System.Collections.Immutable;
DI.Setup(nameof(Composition))
.Bind<IDependency<TT>>().To<AbcDependency<TT>>()
.Bind<IDependency<TT>>("Xyz").To<XyzDependency<TT>>()
.Bind<IService<TT>>().To<Service<TT>>()
// Composition roots
.Root<IService<int>>("IntRoot")
.Root<IService<string>>("StringRoot");
var composition = new Composition();
var intService = composition.IntRoot;
intService.Dependencies.Length.ShouldBe(2);
intService.Dependencies[0].ShouldBeOfType<AbcDependency<int>>();
intService.Dependencies[1].ShouldBeOfType<XyzDependency<int>>();
var stringService = composition.StringRoot;
stringService.Dependencies.Length.ShouldBe(2);
stringService.Dependencies[0].ShouldBeOfType<AbcDependency<string>>();
stringService.Dependencies[1].ShouldBeOfType<XyzDependency<string>>();
interface IDependency<T>;
class AbcDependency<T> : IDependency<T>;
class XyzDependency<T> : IDependency<T>;
interface IService<T>
{
ImmutableArray<IDependency<T>> Dependencies { get; }
}
class Service<T>(IEnumerable<IDependency<T>> dependencies) : IService<T>
{
public ImmutableArray<IDependency<T>> Dependencies { get; }
= [..dependencies];
}
Running this code sample locally
- Make sure you have the .NET SDK 9.0 or later is installed
dotnet --list-sdk
- Create a net9.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
The following partial class will be generated:
partial class Composition
{
private readonly Composition _root;
[OrdinalAttribute(256)]
public Composition()
{
_root = this;
}
internal Composition(Composition parentScope)
{
_root = (parentScope ?? throw new ArgumentNullException(nameof(parentScope)))._root;
}
public IService<string> StringRoot
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
IEnumerable<IDependency<string>> EnumerationOf_perBlockIEnumerable1()
{
yield return new AbcDependency<string>();
yield return new XyzDependency<string>();
}
IEnumerable<IDependency<string>> perBlockIEnumerable1 = EnumerationOf_perBlockIEnumerable1();
return new Service<string>(perBlockIEnumerable1);
}
}
public IService<int> IntRoot
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
IEnumerable<IDependency<int>> EnumerationOf_perBlockIEnumerable1()
{
yield return new AbcDependency<int>();
yield return new XyzDependency<int>();
}
IEnumerable<IDependency<int>> perBlockIEnumerable1 = EnumerationOf_perBlockIEnumerable1();
return new Service<int>(perBlockIEnumerable1);
}
}
}
Class diagram:
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
ServiceᐸStringᐳ --|> IServiceᐸStringᐳ
ServiceᐸInt32ᐳ --|> IServiceᐸInt32ᐳ
AbcDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ
XyzDependencyᐸStringᐳ --|> IDependencyᐸStringᐳ : "Xyz"
AbcDependencyᐸInt32ᐳ --|> IDependencyᐸInt32ᐳ
XyzDependencyᐸInt32ᐳ --|> IDependencyᐸInt32ᐳ : "Xyz"
Composition ..> ServiceᐸStringᐳ : IServiceᐸStringᐳ StringRoot
Composition ..> ServiceᐸInt32ᐳ : IServiceᐸInt32ᐳ IntRoot
ServiceᐸStringᐳ o-- "PerBlock" IEnumerableᐸIDependencyᐸStringᐳᐳ : IEnumerableᐸIDependencyᐸStringᐳᐳ
ServiceᐸInt32ᐳ o-- "PerBlock" IEnumerableᐸIDependencyᐸInt32ᐳᐳ : IEnumerableᐸIDependencyᐸInt32ᐳᐳ
IEnumerableᐸIDependencyᐸStringᐳᐳ *-- AbcDependencyᐸStringᐳ : IDependencyᐸStringᐳ
IEnumerableᐸIDependencyᐸStringᐳᐳ *-- XyzDependencyᐸStringᐳ : "Xyz" IDependencyᐸStringᐳ
IEnumerableᐸIDependencyᐸInt32ᐳᐳ *-- AbcDependencyᐸInt32ᐳ : IDependencyᐸInt32ᐳ
IEnumerableᐸIDependencyᐸInt32ᐳᐳ *-- XyzDependencyᐸInt32ᐳ : "Xyz" IDependencyᐸInt32ᐳ
namespace Pure.DI.UsageTests.BCL.EnumerableGenericsScenario {
class AbcDependencyᐸInt32ᐳ {
+AbcDependency()
}
class AbcDependencyᐸStringᐳ {
+AbcDependency()
}
class Composition {
<<partial>>
+IServiceᐸInt32ᐳ IntRoot
+IServiceᐸStringᐳ StringRoot
}
class IDependencyᐸInt32ᐳ {
<<interface>>
}
class IDependencyᐸStringᐳ {
<<interface>>
}
class IServiceᐸInt32ᐳ {
<<interface>>
}
class IServiceᐸStringᐳ {
<<interface>>
}
class ServiceᐸInt32ᐳ {
+Service(IEnumerableᐸIDependencyᐸInt32ᐳᐳ dependencies)
}
class ServiceᐸStringᐳ {
+Service(IEnumerableᐸIDependencyᐸStringᐳᐳ dependencies)
}
class XyzDependencyᐸInt32ᐳ {
+XyzDependency()
}
class XyzDependencyᐸStringᐳ {
+XyzDependency()
}
}
namespace System.Collections.Generic {
class IEnumerableᐸIDependencyᐸInt32ᐳᐳ {
<<interface>>
}
class IEnumerableᐸIDependencyᐸStringᐳᐳ {
<<interface>>
}
}