Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time
February 23, 2023 13:17
February 10, 2023 18:54
May 8, 2023 11:44
May 8, 2023 11:44
July 2, 2020 14:36
May 8, 2023 11:44
February 9, 2023 22:25


Releases openupm

The extra fast DI (Dependency Injection) library running on Unity Game Engine.

"V" means making Unity's initial "U" more thinner and solid ... !

  • Fast Resolve: Basically 5-10x faster than Zenject.
  • Minimum GC Allocation: In Resolve, we have zero allocation without spawned instances.
  • Small code size: Few internal types and few .callvirt.
  • Assisting correct DI way: Provides simple and transparent API, and carefully select features. This prevents the DI declaration from becoming overly complex.
  • Immutable Container: Thread safety and robustness.


  • Constructor Injection / Method Injection / Property & Field Injection
  • Dispatch own PlayerLoopSystem
  • Flexible scoping
    • Application can freely create nested Lifetime Scope with any async way for you like.
  • Accelerated mode with SourceGenerator (Optional)
  • Diagnositcs window on unity editor
  • UniTask Integration
  • ECS Integration beta


Visit to view the full documentation.


GC Alloc Result Example


Requires Unity 2018.4+

Install via UPM (using Git URL)

  1. Navigate to your project's Packages folder and open the manifest.json file.
  2. Add this line below the "dependencies": { line
    • "jp.hadashikick.vcontainer": "",
  3. UPM should now install the package.

Install via OpenUPM

  1. The package is available on the openupm registry. It's recommended to install it via openupm-cli.
  2. Execute the openum command.
    • openupm add jp.hadashikick.vcontainer

Install manually (using .unitypackage)

  1. Download the .unitypackage from releases page.
  2. Open VContainer.x.x.x.unitypackage

Basic Usage

First, create a scope. References are automatically resolved for types registered here.

public class GameLifetimeScope : LifetimeScope
    public override void Configure(IContainerBuilder builder)

        builder.Register<IRouteSearch, AStarRouteSearch>(Lifetime.Singleton);


Where definitions of classes are

public interface IRouteSearch

public class AStarRouteSearch : IRouteSearch

public class CharacterService
    readonly IRouteSearch routeSearch;

    public CharacterService(IRouteSearch routeSearch)
        this.routeSearch = routeSearch;
public class ActorsView : MonoBehaviour


public class ActorPresenter : IStartable
    readonly CharacterService service;
    readonly ActorsView actorsView;

    public ActorPresenter(
        CharacterService service,
        ActorsView actorsView)
        this.service = service;
        this.actorsView = actorsView;

    void IStartable.Start()
        // Scheduled at Start () on VContainer's own PlayerLoopSystem.
  • In this example, the routeSearch of CharacterService is automatically set as the instance of AStarRouteSearch when CharacterService is resolved.
  • Further, VContainer can have a Pure C# class as an entry point. (Various timings such as Start, Update, etc. can be specified.) This facilitates "separation of domain logic and presentation".

Flexible Scoping with async

LifetimeScope can dynamically create children. This allows you to deal with the asynchronous resource loading that often occurs in games.

public void LoadLevel()
    // ... Loading some assets

    // Create a child scope
    instantScope = currentScope.CreateChild();

    // Create a child scope with LifetimeScope prefab
    instantScope = currentScope.CreateChildFromPrefab(lifetimeScopePrefab);

    // Create a child with additional registration
    instantScope = currentScope.CreateChildFromPrefab(
        builder =>
            // Extra Registrations ...

    instantScope = currentScope.CreateChild(builder =>
        // ExtraRegistrations ...

    instantScope = currentScope.CreateChild(extraInstaller);

public void UnloadLevel()

In addition, you can create a parent-child relationship with LifetimeScope in an Additive scene.

class SceneLoader
    readonly LifetimeScope currentScope;

    public SceneLoader(LifetimeScope currentScope)
        this.currentScope = currentScope; // Inject the LifetimeScope to which this class belongs

    IEnumerator LoadSceneAsync()
        // LifetimeScope generated in this block will be parented by `this.lifetimeScope`
        using (LifetimeScope.EnqueueParent(currentScope))
            // If this scene has a LifetimeScope, its parent will be `parent`.
            var loading = SceneManager.LoadSceneAsync("...", LoadSceneMode.Additive);
            while (!loading.isDone)
                yield return null;

    // UniTask example
    async UniTask LoadSceneAsync()
        using (LifetimeScope.EnqueueParent(parent))
            await SceneManager.LoadSceneAsync("...", LoadSceneMode.Additive);
// LifetimeScopes generated during this block will be additionally Registered.
using (LifetimeScope.Enqueue(builder =>
    // Register for the next scene not yet loaded
    // Loading the scene..

See scoping for more information.


public class FooController : IAsyncStartable
    public async UniTask StartAsync(CancellationToken cancellation)
        await LoadSomethingAsync(cancellation);
        await ...

See integrations for more information.

Diagnostics Window

See diagnostics for more information.


VContainer is inspired by: