Skip to main content

Register Plain C# Type

There are various ways to use Register. Let's take the following complex type as an example.

class ServiceA : IServiceA, IInputPort, IDisposable { /* ... */ }

Register Concrete Type#

builder.Register<ServiceA>(Lifetime.Singleton);

It can resolve like this:

class ClassA{    public ClassA(ServiceA serviceA) { /* ... */ }}

Register as Interface#

builder.Register<IServiceA, ServiceA>();

It can resolve like this:

class ClassA{    public ClassA(IServiceA serviceA) { /* ... */ }}

Register as multiple Interface#

builder.Register<ServiceA>(Lifetime.Singleton)    .As<IServiceA, IInputPort>();

It can resolve like this:

class ClassA{    public ClassA(IServiceA serviceA) { /* ... */ }}
class ClassB{    public ClassB(IInputPort inputPort) { /* ... */ }}

Register all implemented interfaces automatically#

builder.Register<ServiceA>(Lifetime.Singleton)    .AsImplementedInterfaces();

It can resolve like this:

class ClassA{    public ClassA(IServiceA serviceA) { /* ... */ }}
class ClassB{    public ClassB(IInputPort inputPort) { /* ... */ }}

Register all implemented interfaces and concrete type#

builder.Register<ServiceA>(Lifetime.Singleton)    .AsImplementedInterfaces()    .AsSelf();

It can resolve like this:

class ClassA{    public ClassA(IServiceA serviceA) { /* ... */ }}
class ClassB{    public ClassB(IInputPort inputPort) { /* ... */ }}
class ClassB{    public ClassB(ServiceA serviceA) { /* ... */ }}

Register lifecycle marker interfaces#

class GameController : IStartable, ITickable, IDisposable { /* ... */ }
builder.RegisterEntryPoint<GameController>();
note

This is similar to Register<GameController>(Lifetime.Singleton).AsImplementedInterfaces()

If you want to customize the exception handling for entry points, you can register a callback with the following.

builder.RegisterEntryPointExceptionHandler(ex =>{    UnityEngine.Debug.LogException(ex);    // Additional process ...});

If you have multiple EntryPoints, you have the option to use the following declaration as grouping.

builder.UseEntryPoints(entryPoints =>{   entryPoints.Add<ScopedEntryPointA>();   entryPoints.Add<ScopedEntryPointB>();   entryPoints.Add<ScopedEntryPointC>().AsSelf();   entryPoints.OnException(ex => ...)});

This is the same as:

builder.RegisterEntryPoint<ScopedEntryPointA>();builder.RegisterEntryPoint<ScopedEntryPointB>();builder.RegisterEntryPoint<ScopedEntryPointC>().AsSelf();builder.RegisterEntryPointExceptionHandler(ex => ...);

See the Plain C# Entry point section for more information.

Register instance#

// ...var obj = new ServiceA();// ...
builder.RegisterInstance(obj);
note

RegisterIntance always has a Singleton lifetime, so it has no arguments.

It can resolve like this:

class ClassA{    public ClassA(ServiceA serviceA) { /* ... */ }}
note

Instances registered with RegisterInstance are not managed by the container.

  • Dispose will not be executed automatically.
  • Method Injection will not be executed automatically

If you want the container to manage the created instances, consider using the following instead

Register instance as interface#

Use As* declarations.

builder.RegisterInstance<IInputPort>(serviceA);
builder.RegisterInstance(serviceA)    .As<IServiceA, IInputPort>();
builder.RegisterInstance()    .AsImplementedInterfaces();

Register type-specific parameters#

If the types are not unique, but you have a dependency you want to inject at startup, you can use the following:

builder.Register<SomeService>(Lifetime.Singleton)    .WithParameter<string>("http://example.com");

Or, you can name a paramter with a key.

builder.Register<SomeService>(Lifetime.Singleton)    .WithParameter("url", "http://example.com");

It can resolve like this:

class SomeService{    public SomeService(string url) { /* ... */ }}

This Register only works when being injected into SomeService.

class OtherClass{    // ! Error    public OtherClass(string hogehoge) { /* ... */ }}