【问题标题】:Autofac error - No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requestedAutofac 错误 - 从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围
【发布时间】:2015-04-05 17:25:41
【问题描述】:

在我的一个网络应用程序中,我有一个使用 Autofac 的网络服务,svc 文件如下:

<%@ ServiceHost Language="C#" Debug="true" 
Service="MyApp.WebServices.Contracts.Interfaces.IMyWebService, MyApp.WebServices.Contracts" 
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" %>

我像这样为我的 Web 服务应用程序注册依赖项:

public class IocConfig
{        
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();            

        //web services
        builder.RegisterType<MyWebService>().As<IMyWebService>().InstancePerLifetimeScope();

        var container = builder.Build();

        AutofacHostFactory.Container = container;            
    }
}

从另一个 Web 应用程序,我也想使用 Autofac 连接到这些服务,所以我注册了如下依赖项:

public class IocConfig
{
    //Ioc dependencies for frontend application
    public static void RegisterDependencies()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);

        builder.RegisterModule<AutofacWebTypesModule>();

        builder
            .Register(c => new ChannelFactory<ISomeWebService>(
                new BasicHttpBinding(),
                new EndpointAddress("http://localhost/MyApp.WebServices/MyWebService.svc")))
            .InstancePerLifetimeScope();

        //register service proxies
        builder.Register(c => c.Resolve<ChannelFactory<IMyWebService>>().CreateChannel())
            .As<IMyWebService>()
            .UseWcfSafeRelease();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

在其中一个控制器中,我执行以下操作:

public SomeController(IMyWebService myServiceProxy) 
    {
        _myServiceProxy = myServiceProxy;

        var response =_myServiceProxy.CallSomeMethod(new Request()
        {
            EmailAddress = "test@test.com"
        });
    }

正在解析 IMyWebService 类型的 myServiceProxy,我看到它是一个透明代理,但是当我调用“CallSomeMethod”时出现错误:

从请求实例的范围中看不到带有与“AutofacWebRequest”匹配的标记的范围。这通常表明注册为 per-HTTP 请求的组件正在由 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,而不是从容器本身.

我在这里做错了什么?谢谢!

【问题讨论】:

    标签: asp.net-mvc wcf dependency-injection autofac autofactory


    【解决方案1】:

    【讨论】:

    • 将我的依赖生命周期从 InstancePerRequest 更改为 InstancePerLifetimeScope,现在它可以工作了。谢谢!
    • 另外,我的 NHibernate 会话工厂仍然是一个 SingleInstance 生命周期并且它可以工作,问题确实出在 InstancePerRequest 上。
    猜你喜欢
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2021-02-17
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多