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 Typebuilder.Register<ServiceA>(Lifetime.Singleton);
It can resolve like this:
class ClassA{ public ClassA(ServiceA serviceA) { /* ... */ }}
#
Register as Interfacebuilder.Register<IServiceA, ServiceA>();
It can resolve like this:
class ClassA{ public ClassA(IServiceA serviceA) { /* ... */ }}
#
Register as multiple Interfacebuilder.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 automaticallybuilder.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 typebuilder.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 interfacesclass 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 interfaceUse As*
declarations.
builder.RegisterInstance<IInputPort>(serviceA);
builder.RegisterInstance(serviceA) .As<IServiceA, IInputPort>();
builder.RegisterInstance() .AsImplementedInterfaces();
#
Register type-specific parametersIf 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) { /* ... */ }}