Autofac 自有实例
生命周期和作用域
Autofac 使用明确界定的范围来控制生命周期。例如,提供 S
服务及其所有依赖项的组件将在 using
块结束时被释放:
IContainer container = // 正常操作
using (var scope = container.BeginLifetimeScope())
{
var s = scope.Resolve<S>();
s.DoSomething();
}
在 IoC 容器中,释放和销毁组件之间通常存在微妙的区别:释放自有组件不仅仅是销毁组件本身。组件的所有依赖项也会被销毁。释放共享组件通常是无操作的,因为其他组件将继续使用其服务。
关系类型
Autofac 有一个名为 关系类型 的系统,可以用于以声明性方式提供容器的功能。与上面的例子不同,关系类型允许组件以最小的、声明性的方式精确指定所需的容器服务。
自有实例 通过 Owned<T>
关系类型进行消耗。
自有类型 T
当不再需要时,拥有者可以释放一个自有依赖项。自有依赖项通常对应于依赖组件执行的一些工作单元。
public class Consumer
{
private Owned<DisposableComponent> _service;
public Consumer(Owned<DisposableComponent> service)
{
_service = service;
}
public void DoWork()
{
// _service用于某些任务
_service.Value.DoSomething();
// 在这里,_service不再需要,所以
// 它被释放
_service.Dispose();
}
}
当 Consumer
由容器创建时,它所依赖的 Owned<DisposableComponent>
将在其自身的生命周期范围内创建。当 Consumer
完成使用 DisposableComponent
时,释放 Owned<DisposableComponent>
引用将结束包含 DisposableComponent
的生命周期范围。这意味着 DisposableComponent
的所有非共享、可丢弃的依赖项也将被释放。
与 Func 结合使用
通常会将自有实例与Func<T>
关系结合使用,以便可以根据需要动态开始和结束工作单元。
interface IMessageHandler
{
void Handle(Message message);
}
class MessagePump
{
Func<Owned<IMessageHandler>> _handlerFactory;
public MessagePump(Func<Owned<IMessageHandler>> handlerFactory)
{
_handlerFactory = handlerFactory;
}
public void Go()
{
while (true)
{
var message = NextMessage();
using (var handler = _handlerFactory())
{
handler.Value.Handle(message);
}
}
}
}
自有和标签
Owned<T>
创建的生命周期使用作为 ILifetimeScope.Tag
存在的标记功能。Owned<T>
生命周期应用的标签将是 new TypedService(typeof(T))
,即生命周期的标签反映了其入口点。