项目
版本

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)) ,即生命周期的标签反映了其入口点。

在本文档中