diff --git a/README.md b/README.md index c4d6554e..daf474cb 100644 --- a/README.md +++ b/README.md @@ -102,14 +102,6 @@ DI.Setup(nameof(Composition)) > [!NOTE] > In fact, the `Bind().As(Singleton).To()` binding is unnecessary since _Pure.DI_ supports many .NET BCL types out of the box, including [Random](https://github.com/DevTeam/Pure.DI/blob/27a1ccd604b2fdd55f6bfec01c24c86428ddfdcb/src/Pure.DI.Core/Features/Default.g.cs#L289). It was added just for the example of using the _Singleton_ lifetime. -The Pure.DI source code generator works like this: - -```mermaid -flowchart TD - setups[DI setups analysis] --> types["`Types analysis - constructors/methods/properties/fields`"] --> deps[Creating a dependency graph] --> verification[Dependency graph verification] --> code[Code generation] -``` - The above code specifies the generation of a partial class named *__Composition__*, this name is defined in the `DI.Setup(nameof(Composition))` call. This class contains a *__Root__* property that returns a graph of objects with an object of type *__Program__* as the root. The type and name of the property is defined by calling `Root("Root")`. The code of the generated class looks as follows: ```c# @@ -367,13 +359,13 @@ partial class Composition } ``` - - The _compositionTypeName_ parameter can be omitted - if the setup is performed inside a partial class, then the composition will be created for this partial class - for the case of a class with composition kind `CompositionKind.Global`, see [this example](readme/global-compositions.md) + +
Setup arguments @@ -860,6 +852,42 @@ Then documentation for the composition root:
+
+Code generation workflow + +```mermaid +flowchart TD + start@{ shape: circle, label: "Start" } + setups[fa:fa-search DI setups analysis] + types["`fa:fa-search Types analysis + constructors/methods/properties/fields`"] + subgraph dep[Dependency graph] + option[fa:fa-search Selecting a next dependency set] + creating[fa:fa-cog Creating a dependency graph variant] + verification{fa:fa-check-circle Verification} + end + codeGeneration[fa:fa-code Code generation] + compilation[fa:fa-cog Compilation] + failed@{ shape: dbl-circ, label: "fa:fa-thumbs-down Compilation failed" } + success@{ shape: dbl-circ, label: "fa:fa-thumbs-up Success" } + + start ==> setups + setups -.->|Has problems| failed + setups ==> types + types -.-> |Has problems| failed + types ==> option + option ==> creating + option -.-> |There are no other options| failed + creating ==> verification + verification -->|Has problems| option + verification ==>|Correct| codeGeneration + codeGeneration ==> compilation + compilation -.-> |Has problems| failed + compilation ==> success +``` + +
+ ## NuGet packages | | | | diff --git a/readme/FooterTemplate.md b/readme/FooterTemplate.md index b6b0bc47..6a0d66b1 100644 --- a/readme/FooterTemplate.md +++ b/readme/FooterTemplate.md @@ -62,13 +62,13 @@ partial class Composition } ``` - - The _compositionTypeName_ parameter can be omitted - if the setup is performed inside a partial class, then the composition will be created for this partial class - for the case of a class with composition kind `CompositionKind.Global`, see [this example](readme/global-compositions.md) + +
Setup arguments @@ -555,6 +555,42 @@ Then documentation for the composition root:
+
+Code generation workflow + +```mermaid +flowchart TD + start@{ shape: circle, label: "Start" } + setups[fa:fa-search DI setups analysis] + types["`fa:fa-search Types analysis + constructors/methods/properties/fields`"] + subgraph dep[Dependency graph] + option[fa:fa-search Selecting a next dependency set] + creating[fa:fa-cog Creating a dependency graph variant] + verification{fa:fa-check-circle Verification} + end + codeGeneration[fa:fa-code Code generation] + compilation[fa:fa-cog Compilation] + failed@{ shape: dbl-circ, label: "fa:fa-thumbs-down Compilation failed" } + success@{ shape: dbl-circ, label: "fa:fa-thumbs-up Success" } + + start ==> setups + setups -.->|Has problems| failed + setups ==> types + types -.-> |Has problems| failed + types ==> option + option ==> creating + option -.-> |There are no other options| failed + creating ==> verification + verification -->|Has problems| option + verification ==>|Correct| codeGeneration + codeGeneration ==> compilation + compilation -.-> |Has problems| failed + compilation ==> success +``` + +
+ ## NuGet packages | | | | diff --git a/readme/ReadmeTemplate.md b/readme/ReadmeTemplate.md index 5aab452d..61cdff14 100644 --- a/readme/ReadmeTemplate.md +++ b/readme/ReadmeTemplate.md @@ -62,14 +62,6 @@ DI.Setup(nameof(Composition)) > [!NOTE] > In fact, the `Bind().As(Singleton).To()` binding is unnecessary since _Pure.DI_ supports many .NET BCL types out of the box, including [Random](https://github.com/DevTeam/Pure.DI/blob/27a1ccd604b2fdd55f6bfec01c24c86428ddfdcb/src/Pure.DI.Core/Features/Default.g.cs#L289). It was added just for the example of using the _Singleton_ lifetime. -The Pure.DI source code generator works like this: - -```mermaid -flowchart TD - setups[DI setups analysis] --> types["`Types analysis - constructors/methods/properties/fields`"] --> deps[Creating a dependency graph] --> verification[Dependency graph verification] --> code[Code generation] -``` - The above code specifies the generation of a partial class named *__Composition__*, this name is defined in the `DI.Setup(nameof(Composition))` call. This class contains a *__Root__* property that returns a graph of objects with an object of type *__Program__* as the root. The type and name of the property is defined by calling `Root("Root")`. The code of the generated class looks as follows: ```c# diff --git a/readme/SingletonDetails.md b/readme/SingletonDetails.md index 7804c380..248e379b 100644 --- a/readme/SingletonDetails.md +++ b/readme/SingletonDetails.md @@ -45,10 +45,10 @@ classDiagram CompositionRoot o-- "Scoped" Service1 : IService1 CompositionRoot *-- "3 " Service2 : IService2 CompositionRoot *-- Service3 : IService3 - CompositionRoot o-- "2 Scoped" Service4 : IService4 + CompositionRoot o-- "2 Scoped instances" Service4 : IService4 Service1 *-- Service2 : IService2 Service2 *-- "5 " Service3 : IService3 - Service3 o-- "2 Scoped" Service4 : IService4 + Service3 o-- "2 Scoped instances" Service4 : IService4 ``` ### Generated code diff --git a/readme/default-lifetime-for-a-type.md b/readme/default-lifetime-for-a-type.md index d8c96fd4..b394f720 100644 --- a/readme/default-lifetime-for-a-type.md +++ b/readme/default-lifetime-for-a-type.md @@ -112,6 +112,6 @@ classDiagram <> } Composition ..> Service : IService Root - Service o-- "2 Singleton" Dependency : IDependency + Service o-- "2 Singleton instances" Dependency : IDependency ``` diff --git a/readme/default-lifetime.md b/readme/default-lifetime.md index 30e2e445..e5276f11 100644 --- a/readme/default-lifetime.md +++ b/readme/default-lifetime.md @@ -120,6 +120,6 @@ classDiagram <> } Composition ..> Service : IService Root - Service o-- "2 Singleton" Dependency : IDependency + Service o-- "2 Singleton instances" Dependency : IDependency ``` diff --git a/readme/perblock.md b/readme/perblock.md index e4e835d3..b3077e78 100644 --- a/readme/perblock.md +++ b/readme/perblock.md @@ -113,8 +113,8 @@ classDiagram <> } Composition ..> Service : Service Root - Service o-- "2 PerBlock" Dependency : IDependency + Service o-- "2 PerBlock instances" Dependency : IDependency Service o-- "Singleton" ValueTupleᐸIDependencyˏIDependencyᐳ : ValueTupleᐸIDependencyˏIDependencyᐳ - ValueTupleᐸIDependencyˏIDependencyᐳ o-- "2 PerBlock" Dependency : IDependency + ValueTupleᐸIDependencyˏIDependencyᐳ o-- "2 PerBlock instances" Dependency : IDependency ``` diff --git a/readme/perresolve.md b/readme/perresolve.md index 03fd9ba0..479bba19 100644 --- a/readme/perresolve.md +++ b/readme/perresolve.md @@ -128,8 +128,8 @@ classDiagram <> } Composition ..> Service : Service Root - Service o-- "2 PerResolve" Dependency : IDependency + Service o-- "2 PerResolve instances" Dependency : IDependency Service o-- "Singleton" ValueTupleᐸIDependencyˏIDependencyᐳ : ValueTupleᐸIDependencyˏIDependencyᐳ - ValueTupleᐸIDependencyˏIDependencyᐳ o-- "2 PerResolve" Dependency : IDependency + ValueTupleᐸIDependencyˏIDependencyᐳ o-- "2 PerResolve instances" Dependency : IDependency ``` diff --git a/readme/singleton.md b/readme/singleton.md index 3282bc0e..f6abc02c 100644 --- a/readme/singleton.md +++ b/readme/singleton.md @@ -123,6 +123,6 @@ classDiagram <> } Composition ..> Service : IService Root - Service o-- "2 Singleton" Dependency : IDependency + Service o-- "2 Singleton instances" Dependency : IDependency ``` diff --git a/src/Pure.DI.Core/Core/Code/ClassDiagramBuilder.cs b/src/Pure.DI.Core/Core/Code/ClassDiagramBuilder.cs index 7ea14cc7..3992b65b 100644 --- a/src/Pure.DI.Core/Core/Code/ClassDiagramBuilder.cs +++ b/src/Pure.DI.Core/Core/Code/ClassDiagramBuilder.cs @@ -190,6 +190,10 @@ private static string FormatCardinality(int count, Lifetime lifetime) if (lifetime != Lifetime.Transient) { cardinality.Append(lifetime); + if (count > 1) + { + cardinality.Append(" instances"); + } } if (cardinality.Length > 0) diff --git a/src/Pure.DI.Core/Features/Default.g.cs b/src/Pure.DI.Core/Features/Default.g.cs index 71e942c1..3c9977e8 100644 --- a/src/Pure.DI.Core/Features/Default.g.cs +++ b/src/Pure.DI.Core/Features/Default.g.cs @@ -111,9 +111,9 @@ private static void Setup() .To(_ => global::System.Buffers.ArrayPool.Shared) #endif .Bind>() + .Bind>() .Bind>() .To((TT[] arr) => new global::System.Collections.Generic.List(arr)) - .Bind>() .Bind>() .To((TT[] arr) => new global::System.Collections.ObjectModel.Collection(arr)) #if NETSTANDARD || NET || NETCOREAPP || NET45_OR_GREATER