项目
版本

Autofac 服务解析

在你已经注册了相应的组件,并且公开了它们提供的服务之后 组件注册,你可以从构建好的容器或者子 生命周期范围(lifetime scope) 中获取服务。使用 Resolve() 方法来实现:

var builder = new ContainerBuilder();
builder.RegisterType<MyComponent>().As<IService>();
var container = builder.Build();

using(var scope = container.BeginLifetimeScope())
{
    var service = scope.Resolve<IService>();
}

注意例子中是通过生命周期范围而不是直接从容器中获取服务——你也应该这样做。

虽然可以从根容器中直接获取组件,但在某些情况下这样做可能会导致内存泄漏。 建议你尽可能地从生命周期范围中获取组件,确保服务实例能够被正确地释放和垃圾回收。有关更多内容,请阅读关于 控制范围和生命周期 的章节。

在解析服务时,Autofac 会自动处理服务依赖关系树的整个结构,并解决构建服务所需的任何依赖。如果你有 循环依赖而没有得到妥善处理,或者缺少必需的服务,你会得到一个 DependencyResolutionException 异常。

如果你需要获取一个可能注册也可能未注册的服务,你可以尝试使用 ResolveOptional()TryResolve() 来进行条件解析:

// 如果 IService 已经注册,它会被解析;如果未注册,返回值将是 `null`。
var service = scope.ResolveOptional<IService>();

// 如果 IProvider 已经注册,provider 变量将保存值;否则你可以采取其他措施。
IProvider provider = null;
if(scope.TryResolve<IProvider>(out provider))
{
    // 使用解析后的 provider 值执行一些操作。
}

ResolveOptional()TryResolve() 都围绕着特定服务是否注册的条件性。如果服务已注册,将尝试解析。如果解析失败(例如,由于缺少注册的依赖),你仍然会得到一个 DependencyResolutionException。如果你需要基于服务是否成功解析的条件性解析,可以将 Resolve() 调用包裹在一个 try/catch 块中。

你可能还会对查看 高级主题列表 感兴趣,了解 命名和键控服务与组件元数据一起工作 等与服务解析相关的其他话题。

在本文档中