在不注册服务类型的情况下解析autofac中的服务

问题描述:

是否可以在不注册容器的情况下解析autofac中的服务?在不注册服务类型的情况下解析autofac中的服务

到目前为止,我想出了这样的事情:

public object ResolveUnknownService(IContainer container, Type serviceType) 
    { 
     ILifetimeScope lifetimeScope = container.BeginLifetimeScope(b => b.RegisterType(serviceType).ExternallyOwned()); 
     try 
     { 
      return lifetimeScope.Resolve(serviceType); 
     } 
     finally 
     { 
      lifetimeScope.Dispose(); 
     } 
    } 

它的工作原理,但我有点担心的表现。我也不想使用AnyConcreteTypeNotAlreadyRegisteredSource,因为我想具体说明我想要(或不想)以这种方式解决哪些服务。

在您的示例中,处置临时生存期范围将处理返回的对象及其任何相关性;组件的寿命与其解决的寿命范围一样长。

是否有任何已知的标准来识别这些类型? AnyConcrete...类的构造函数有一个过载,它可以指定一个过滤器来解析它的内容。如果有这样的标准,那么RegisterAssemblyTypes()几乎总是一个更好的选择。

(除非你用传统/第三方框架集成那么这种模式很可能不使用Autofac的最佳方式,因为它会导致下来了服务定位器路径。当然情况因人而异。)

+0

在我例如,我在注册结束时使用了ExternallyOwned,所以我认为组件应该在临时生命周期范围处理后生存。 – tomazv 2010-11-16 07:35:30

+0

主要场景是我们的应用程序中的插件系统。插件可以通过构造函数注入它们的依赖关系,并且只有在解析时才知道一些依赖关系。我们用对象/插件工厂中的输入参数来包装Autofac。 API用法如下所示:objectFactory.New(typeof(MyPlugin))。WithParameter(typeof(MyDependency),myDependencyValue).Build()。这会创建MyPlugin的新实例。类型MyDependency可能在构造函数中,也可能不在构造函数中,也可能有其他依赖项已经被Autofac注册。 – tomazv 2010-11-16 08:13:27

+0

如果组件具有一次性依赖关系,则无论是否使用“ExternallyOwned()”,这些依赖关系都将被处置。解决并维持一个“拥有的”对你来说可能是更好的选择。您可能还会对MEF(和Autofac)可以结合IEnumerable 和Lazy 处理插件选择场景的方式感兴趣 - http://mef.codeplex.com/wikipage?title=Exports %20于是%20Metadata – 2010-11-18 09:00:43