是否可以在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,因为我想具体说明我想要(或不想要)以这种方式解决哪些服务。
答案 0 :(得分:1)
在您的示例中,处置临时生存范围将处理返回的对象及其任何依赖项;组件只有在解决它们的生命周期范围内才能生效。
是否有任何已知标准可识别这些类型? AnyConcrete...
类的构造函数有一个重载,可以指定它将解析的内容的过滤器。如果有这样的标准,那么RegisterAssemblyTypes()
几乎总是更好的选择。
(除非您与传统/第三方框架集成,否则这种模式可能不是使用Autofac的最佳方式,因为它导致了服务定位器路径。当然是YMMV。)