Skip to content

Latest commit

 

History

History
140 lines (120 loc) · 3.29 KB

File metadata and controls

140 lines (120 loc) · 3.29 KB

ValueTask

Demonstrates ValueTask<T> injection, which provides a more efficient alternative to Task<T> for scenarios where the result is often already available synchronously.

using Shouldly;
using Pure.DI;

DI.Setup(nameof(Composition))
    .Bind<IConnection>().To<CloudConnection>()
    .Bind<IDataProcessor>().To<DataProcessor>()

    // Composition root
    .Root<IDataProcessor>("DataProcessor");

var composition = new Composition();
var processor = composition.DataProcessor;
await processor.ProcessDataAsync();

interface IConnection
{
    ValueTask<bool> PingAsync();
}

class CloudConnection : IConnection
{
    public ValueTask<bool> PingAsync() => ValueTask.FromResult(true);
}

interface IDataProcessor
{
    ValueTask ProcessDataAsync();
}

class DataProcessor(ValueTask<IConnection> connectionTask) : IDataProcessor
{
    public async ValueTask ProcessDataAsync()
    {
        // The connection is resolved asynchronously, allowing potential
        // non-blocking initialization or resource allocation.
        var connection = await connectionTask;
        await connection.PingAsync();
    }
}
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

Note

ValueTask<T> reduces allocations compared to Task<T> when operations complete synchronously, making it ideal for high-performance scenarios.

The following partial class will be generated:

partial class Composition
{
  public IDataProcessor DataProcessor
  {
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    get
    {
      ValueTask<IConnection> transientValueTask462;
      IConnection localValue40 = new CloudConnection();
      // Initializes a new instance of the ValueTask class using the supplied instance
      transientValueTask462 = new ValueTask<IConnection>(localValue40);
      return new DataProcessor(transientValueTask462);
    }
  }
}

Class diagram:

---
 config:
  maxTextSize: 2147483647
  maxEdges: 2147483647
  class:
   hideEmptyMembersBox: true
---
classDiagram
	CloudConnection --|> IConnection
	DataProcessor --|> IDataProcessor
	Composition ..> DataProcessor : IDataProcessor DataProcessor
	DataProcessor *--  ValueTaskᐸIConnectionᐳ : ValueTaskᐸIConnectionᐳ
	ValueTaskᐸIConnectionᐳ *--  CloudConnection : IConnection
	namespace Pure.DI.UsageTests.BCL.ValueTaskScenario {
		class CloudConnection {
				<<class>>
			+CloudConnection()
		}
		class Composition {
		<<partial>>
		+IDataProcessor DataProcessor
		}
		class DataProcessor {
				<<class>>
			+DataProcessor(ValueTaskᐸIConnectionᐳ connectionTask)
		}
		class IConnection {
			<<interface>>
		}
		class IDataProcessor {
			<<interface>>
		}
	}
	namespace System.Threading.Tasks {
		class ValueTaskᐸIConnectionᐳ {
				<<struct>>
		}
	}
Loading