AutoFac - 使用已知服务实例化未注册的服务

Pau*_*opf 4 ioc-container autofac

使用已知服务实例化未注册的服务(通过ctr注入它们).

我想避免容器污染.

Ily*_*lya 8

这是从容器中解析未注册的具体类型的另一种方法.请注意,所有autofac构造函数查找和选择逻辑,所有注册事件处理程序仍然有效.

首先,您定义此方法:

    public static object ResolveUnregistered(this IComponentContext context, Type serviceType, IEnumerable<Parameter> parameters)
    {
        var scope = context.Resolve<ILifetimeScope>();
        using (var innerScope = scope.BeginLifetimeScope(b => b.RegisterType(serviceType)))
        {
            IComponentRegistration reg;
            innerScope.ComponentRegistry.TryGetRegistration(new TypedService(serviceType), out reg);

            return context.ResolveComponent(reg, parameters);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我们的想法是从派生上下文中获取组件注册并在当前上下文中解析它.然后你可以创建一些方便的重载:

    public static object ResolveUnregistered(this IComponentContext context, Type serviceType)
    {
        return ResolveUnregistered(context, serviceType, Enumerable.Empty<Parameter>());
    }

    public static object ResolveUnregistered(this IComponentContext context, Type serviceType, params Parameter[] parameters)
    {
        return ResolveUnregistered(context, serviceType, (IEnumerable<Parameter>)parameters);
    }

    public static TService ResolveUnregistered<TService>(this IComponentContext context)
    {
        return (TService)ResolveUnregistered(context, typeof(TService), Enumerable.Empty<Parameter>());
    }

    public static TService ResolveUnregistered<TService>(this IComponentContext context, params Parameter[] parameters)
    {
        return (TService)ResolveUnregistered(context, typeof(TService), (IEnumerable<Parameter>)parameters);
    }
Run Code Online (Sandbox Code Playgroud)