在autofac中解析服务而不注册服务类型

时间:2010-11-15 09:20:12

标签: c# .net 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,因为我想具体说明我想要(或不想要)以这种方式解决哪些服务。

1 个答案:

答案 0 :(得分:1)

在您的示例中,处置临时生存范围将处理返回的对象及其任何依赖项;组件只有在解决它们的生命周期范围内才能生效。

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

(除非您与传统/第三方框架集成,否则这种模式可能不是使用Autofac的最佳方式,因为它导致了服务定位器路径。当然是YMMV。)