Appearance
Service Lifetimes
Lamar's service lifetime support exactly reflects the behavior of the ASP.Net Core DI container, as described in this article. This behavior is different than the older StructureMap lifecycle logic.
The supported life-cycles are:
Singleton
-- Only one object instance is created for the entire applicationScoped
-- Only one object instance is created for a container, whether that is the root container or a scoped (nested) container. This maps to StructureMap'sContainerScoped
lifecycleTransient
-- A new object instance is created for every single request, including dependencies. This behavior is not consistent with StructureMap's oldTransient
and maps to StructureMap's oldAlwaysUnique
lifecycle
There is no equivalent in Lamar to StructureMap's version of Transient
or the rarely used ThreadLocal
lifecycle. HttpContext
related scopes are no longer supported, with the assumption that Scoped
is a useful replacement for HTTP request scoping of services.
Here are some sample usages of registering services with a lifetime:
cs
public class LifetimeRegistry : ServiceRegistry
{
public LifetimeRegistry()
{
// Lifetimes the ASP.Net Core way
// The registration methods are all extension
// methods, so hence, "this."
this.AddTransient<IWidget, AWidget>();
this.AddSingleton<IClock, Clock>();
this.AddScoped<IUnitOfWork, UnitOfWork>();
// Lifetimes the old StructureMap way
// Transient is the default
For<IWidget>().Use<AWidget>();
For<IClock>().Use<Clock>().Singleton();
// or
ForSingletonOf<IClock>().Use<Clock>();
For<IUnitOfWork>().Use<UnitOfWork>().Scoped();
}
}