Skip to content

Latest commit

 

History

History
134 lines (111 loc) · 2.91 KB

File metadata and controls

134 lines (111 loc) · 2.91 KB

Tag attribute

Tags let you choose among multiple implementations of the same contract.

using Shouldly;
using Pure.DI;

DI.Setup(nameof(Composition))
    .Bind("Fast").To<FastRenderer>()
    .Bind("Quality").To<QualityRenderer>()
    .Bind().To<PageRenderer>()

    // Composition root
    .Root<IPageRenderer>("Renderer");

var composition = new Composition();
var pageRenderer = composition.Renderer;
pageRenderer.FastRenderer.ShouldBeOfType<FastRenderer>();
pageRenderer.QualityRenderer.ShouldBeOfType<QualityRenderer>();

interface IRenderer;

class FastRenderer : IRenderer;

class QualityRenderer : IRenderer;

interface IPageRenderer
{
    IRenderer FastRenderer { get; }

    IRenderer QualityRenderer { get; }
}

class PageRenderer(
    [Tag("Fast")] IRenderer fastRenderer,
    [Tag("Quality")] IRenderer qualityRenderer)
    : IPageRenderer
{
    public IRenderer FastRenderer { get; } = fastRenderer;

    public IRenderer QualityRenderer { get; } = qualityRenderer;
}
Running this code sample locally
dotnet --list-sdk
  • Create a net10.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

A tag can be a constant, a type, a smart tag, or an enum value. The Tag attribute is part of the API, but you can define your own in any assembly or namespace.

The following partial class will be generated:

partial class Composition
{
  public IPageRenderer Renderer
  {
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    get
    {
      return new PageRenderer(new FastRenderer(), new QualityRenderer());
    }
  }
}

Class diagram:

---
 config:
  maxTextSize: 2147483647
  maxEdges: 2147483647
  class:
   hideEmptyMembersBox: true
---
classDiagram
	FastRenderer --|> IRenderer : "Fast" 
	QualityRenderer --|> IRenderer : "Quality" 
	PageRenderer --|> IPageRenderer
	Composition ..> PageRenderer : IPageRenderer Renderer
	PageRenderer *--  FastRenderer : "Fast"  IRenderer
	PageRenderer *--  QualityRenderer : "Quality"  IRenderer
	namespace Pure.DI.UsageTests.Basics.TagAttributeScenario {
		class Composition {
		<<partial>>
		+IPageRenderer Renderer
		}
		class FastRenderer {
				<<class>>
			+FastRenderer()
		}
		class IPageRenderer {
			<<interface>>
		}
		class IRenderer {
			<<interface>>
		}
		class PageRenderer {
				<<class>>
			+PageRenderer(IRenderer fastRenderer, IRenderer qualityRenderer)
		}
		class QualityRenderer {
				<<class>>
			+QualityRenderer()
		}
	}
Loading