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