using Pure.DI;
using UnityEngine;
public class Clock : MonoBehaviour
{
private const float HoursToDegrees = -30f, MinutesToDegrees = -6f, SecondsToDegrees = -6f;
[SerializeField]
private Transform hoursPivot;
[SerializeField]
private Transform minutesPivot;
[SerializeField]
private Transform secondsPivot;
[Dependency]
public IClockService ClockService { private get; set; }
public void Start()
{
// Injects dependencies
Composition.Shared.BuildUp(this);
}
public void Update()
{
var now = ClockService.Now.TimeOfDay;
hoursPivot.localRotation = Quaternion
.Euler(0f, 0f, HoursToDegrees * (float)now.TotalHours);
minutesPivot.localRotation = Quaternion
.Euler(0f, 0f, MinutesToDegrees * (float)now.TotalMinutes);
secondsPivot.localRotation = Quaternion
.Euler(0f, 0f, SecondsToDegrees * (float)now.TotalSeconds);
}
}
public class OtherClock : MonoBehaviour
{
[Dependency]
public IClockService ClockService { private get; set; }
public void Start()
{
// Injects dependencies
Composition.Shared.BuildUp(this);
}
public void Update()
{
// ReSharper disable once UnusedVariable
var now = ClockService.Now.TimeOfDay;
}
}
public interface IClockService
{
DateTime Now { get; }
}
public class ClockService : IClockService
{
public DateTime Now => DateTime.Now;
}
internal partial class Composition
{
public static readonly Composition Shared = new();
private static void Setup() =>
DI.Setup()
.Bind().As(Lifetime.Singleton).To<ClockService>()
// Creates a builder for each type inherited from MonoBehaviour.
// These types must be available at this point in the code.
.Builders<MonoBehaviour>();
}
Running this code sample locally
- Make sure you have the .NET SDK 9.0 or later is installed
dotnet --list-sdk
- Create a net9.0 (or later) console application
dotnet new console -n Sample
- Add reference to NuGet package
dotnet add package Pure.DI
- Copy the example code into the Program.cs file
You are ready to run the example 🚀
dotnet run