3、服务解析(Resolving Services)
当你完成组件注册,并将组件暴露为适当的服务后你就可以通过容器或者容器的子生命周期域来解析服务(After you have your components registered with appropriate services exposed, you can resolve services from the built container and child lifetime scopes)。你可以通过Resolve()方法来解析服务。
var builder = new ContainerBuilder(); builder.RegisterType<MyComponent>.As<IService>(); var container = builder.Build(); using(var scope = container.BeginLifetimeScope()) {
var service = scope.Resolve<IService>(); }
你可能已经注意到例子中是通过容器的子生命周期域对服务进行解析而不是直接使用容器(container)来接服务的——你也应该以这样的方式来解析服务。
虽然也可以直接使用容器(container)来解析服务,但如果你这样做可能导致应用程序内存泄漏。所以建议你总是尽可能的在自生命周期域中解析服务,这样autofac能够帮助你妥善的处理对象销毁以及垃圾回收工作。你将在今后的章节中了解到更详细的内容。
解析服务时,autofac将自动的连接服务的整个依赖层次,并且自动构件服务所需要的依赖项。当你的程序中存在循环依赖项或者依赖项缺失,那么程序将会抛出DependencyResolutionException异常。
假设你有一个服务,但不能确定它是否已经注册到容器当中,你可以尝试使用ResolveOptional() 或者TryResolve()方法进行条件解析:
//如果已经注册了IService服务,那么它将被正确的解析, //如果没有对IService服务进行注册,那么该方法将返回null var service = scope.ResolveOptional<IService>(); //如果IProvider进行了注册,那么provider将获得对象, //如果IProvider没有注册,那么你可以进行其他操作 IProvider provider = null if(scope.TryResolve<IProvider>(out provider)) { //服务被成功解析 }
3.1、为解析传递参数(Passing Parameters to Resolve)
明天继续...
PS:本系列博客是对autofac英文资料的翻译,主要目的是为了提高自己英文阅读能力,同时能够帮助有需要的人,原文地址http://autofac.readthedocs.org/en/latest/getting-started/index.html。