在不注册服务类型的情况下解析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的最佳方式,因为它会导致下来了服务定位器路径。当然情况因人而异。)
在我例如,我在注册结束时使用了ExternallyOwned,所以我认为组件应该在临时生命周期范围处理后生存。 – tomazv 2010-11-16 07:35:30
主要场景是我们的应用程序中的插件系统。插件可以通过构造函数注入它们的依赖关系,并且只有在解析时才知道一些依赖关系。我们用对象/插件工厂中的输入参数来包装Autofac。 API用法如下所示:objectFactory.New(typeof(MyPlugin))。WithParameter(typeof(MyDependency),myDependencyValue).Build()。这会创建MyPlugin的新实例。类型MyDependency可能在构造函数中,也可能不在构造函数中,也可能有其他依赖项已经被Autofac注册。 – tomazv 2010-11-16 08:13:27
如果组件具有一次性依赖关系,则无论是否使用“ExternallyOwned()”,这些依赖关系都将被处置。解决并维持一个“拥有的”对你来说可能是更好的选择。您可能还会对MEF(和Autofac)可以结合IEnumerable 和Lazy 处理插件选择场景的方式感兴趣 - http://mef.codeplex.com/wikipage?title=Exports %20于是%20Metadata –
2010-11-18 09:00:43