Shows how to declare a binding directly on an implementation type with the built-in BindAttribute.
using Shouldly;
using Pure.DI;
DI.Setup(nameof(Composition))
// Composition root
.Root<IMessageWriter>("Writer", "console");
var composition = new Composition();
var writer = composition.Writer;
writer.Write("Pure.DI");
writer.ShouldBeOfType<ConsoleMessageWriter>();
writer.ShouldBeSameAs(composition.Writer);
interface IMessageWriter
{
void Write(string message);
}
[Bind(typeof(IMessageWriter), Lifetime.Singleton, "console")]
class ConsoleMessageWriter : IMessageWriter
{
public void Write(string message) => Console.WriteLine(message);
}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
BindAttribute is registered by default and can provide the contract type, lifetime, and tag. Attributes inside the same square-bracket group form one binding; separate Bind groups create separate bindings.
The following partial class will be generated
partial class Composition
{
#if NET9_0_OR_GREATER
private readonly Lock _lock = new Lock();
#else
private readonly Object _lock = new Object();
#endif
private ConsoleMessageWriter? _singletonConsoleMessageWriter;
public IMessageWriter Writer
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get
{
if (_singletonConsoleMessageWriter is null)
lock (_lock)
if (_singletonConsoleMessageWriter is null)
{
_singletonConsoleMessageWriter = new ConsoleMessageWriter();
}
return _singletonConsoleMessageWriter;
}
}
}Class diagram:
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
ConsoleMessageWriter --|> IMessageWriter : "console"
Composition ..> ConsoleMessageWriter : IMessageWriter Writer
namespace Pure.DI.UsageTests.Attributes.BindAttributeScenario {
class Composition {
<<partial>>
+IMessageWriter Writer
}
class ConsoleMessageWriter {
<<class>>
+ConsoleMessageWriter()
}
class IMessageWriter {
<<interface>>
}
}
See also: