1.建立一个新的生命周期范围
您能够经过在任何现有生命周期做用域上从根容器开始调用BeginLifetimeScope()
方法来建立生命周期做用域。生命周期做用域是可销毁的,他们跟踪组件的处置,因此确保你老是调用“Dispose()”
或者把它们包装在“using”
语句中。
using(var scope = container.BeginLifetimeScope())
{
// 从做为根容器子项的做用域来解析服务
var service = scope.Resolve<IService>();
// 可以建立嵌套的做用域...
using(var unitOfWorkScope = scope.BeginLifetimeScope())
{
var anotherService = unitOfWorkScope.Resolve<IOther>();
}
}
2.实例周期范围
2.1一个依赖一个实例(InstancePerDependency)
使用这个选项,每次请求服务都会返回一个新实例,这是默认选项。
var builder = new ContainerBuilder();
builder.RegisterType<Worker>();
builder.RegisterType<Worker>().InstancePerDependency();
2.2 单个实例(SingleInstance)
在整个进程中,对象永远都是同一个实例
var builder = new ContainerBuilder();
builder.RegisterType<Worker>().SingleInstance();
2.3每一个生命周期范围一个实例 (InstancePerLifetimeScope)
var builder = new ContainerBuilder();
builder.RegisterType<Worker>().InstancePerLifetimeScope();
2.4每一个匹配的生命周期范围一个实例(InstancePerMatchingLifetimeScope)
var builder = new ContainerBuilder();
builder.RegisterType<Worker>().InstancePerMatchingLifetimeScope("myscope");
2.5 每一个请求一个实例( InstancePerRequest)
var builder = new ContainerBuilder();
builder.RegisterType<Worker>().InstancePerRequest();
2.6每一个 Owned 一个实例 ( InstancePerOwned)
var builder = new ContainerBuilder();
builder.RegisterType<MessageHandler>();
builder.RegisterType<ServiceForHandler>().InstancePerOwned<MessageHandler>();
// 本例中 ServiceForHandler 服务会限制在 MessageHandler 实例范围内。
using(var scope = container.BeginLifetimeScope())
{
// MessageHandler 和附属的 ServiceForHandler
// 在 scope 下面的一个微型的 lifetime scope 中。
// 解析 Owned<T> 须要程序员负责执行清理工做。
var h1 = scope.Resolve<Owned<MessageHandler>>();
h1.Dispose();
}
2.7 线程范围经过
// InstancePerLifetimeScope,每一个线程创建本身的LifetimeScope
var builder = new ContainerBuilder();
builder.RegisterType<Service>().InstancePerLifetimeScope();
var container = builder.Build();
// 而后让每一个建立本身的 lifetime scope
void ThreadStart()
{
using (var threadLifetime = container.BeginLifetimeScope())
{
var thisThreadsInstance = threadLifetime.Resolve<MyThreadScopedComponent>();
}
}
注:在多线程场景下,要当心不要将父范围清理掉。不然,派生线程中的子范围将没法解析服务。