To use dependency injection on a property, make sure the property is writable and simply add the Ordinal attribute to that property, specifying the ordinal that will be used to determine the injection order:
using Shouldly;
using Pure.DI;
DI.Setup(nameof(Composition))
.Bind<ILogger>().To<ConsoleLogger>()
.Bind<IService>().To<Service>()
// Composition root
.Root<IService>("MyService");
var composition = new Composition();
var service = composition.MyService;
service.Logger.ShouldBeOfType<ConsoleLogger>();
interface ILogger;
class ConsoleLogger : ILogger;
interface IService
{
ILogger? Logger { get; }
}
class Service : IService
{
// The Dependency attribute specifies to perform an injection,
// the integer value in the argument specifies
// the ordinal of injection.
// Usually, property injection is used for optional dependencies.
[Dependency] public ILogger? Logger { get; set; }
}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 runThe key points are:
- The property must be writable
- The
Dependency(orOrdinal) attribute is used to mark the property for injection - The DI automatically injects the dependency when resolving the object graph
The following partial class will be generated:
partial class Composition
{
public IService MyService
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
var transientService316 = new Service();
transientService316.Logger = new ConsoleLogger();
return transientService316;
}
}
}Class diagram:
---
config:
maxTextSize: 2147483647
maxEdges: 2147483647
class:
hideEmptyMembersBox: true
---
classDiagram
ConsoleLogger --|> ILogger
Service --|> IService
Composition ..> Service : IService MyService
Service *-- ConsoleLogger : ILogger
namespace Pure.DI.UsageTests.Basics.PropertyInjectionScenario {
class Composition {
<<partial>>
+IService MyService
}
class ConsoleLogger {
<<class>>
+ConsoleLogger()
}
class ILogger {
<<interface>>
}
class IService {
<<interface>>
}
class Service {
<<class>>
+Service()
+ILogger Logger
}
}