【问题标题】:Autofac resolve types in static class of Web Form ApplicationAutofac 解析 Web 表单应用程序的静态类中的类型
【发布时间】:2017-09-06 06:15:26
【问题描述】:

Autofac 已在 Web 表单应用程序中进行如下配置。

var builder = new ContainerBuilder();
BootStrapper.InitializeBizTypes(builder);
builder.RegisterType<Component>().**InstancePerRequest()**;
_containerProvider = new ContainerProvider(builder.Build());

页面中有一个GridView与ObjectDataSource绑定,对于ObjectDataSource,SelectMethod是一个静态类中的方法。

我在静态类中的代码:

private static IComponentContext GetContainer()
    {
        var cpa = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance;
        return cpa.ContainerProvider.ApplicationContainer;
    }

    public static IList<RoleDto> GetRoles()
    {
        ***var biz = GetContainer().Resolve<IRoleBiz>();***
        return biz.GetRoles();
    }

解析界面时出现以下错误。

标签匹配“AutofacWebRequest”的范围不可见 请求实例的范围。

如果您在 Web 应用程序的执行过程中看到这种情况,通常是 表示注册为每个 HTTP 请求的组件正在 由 SingleInstance() 组件(或类似场景)请求。 在 web 集成下总是从 依赖解析器或请求生命周期范围,从不来自 容器本身。

所以我的问题是,当生命周期范围为“InstancePerRequest”时,如何在 asp.net Web 表单应用程序中解析静态类中的注册类型?

【问题讨论】:

    标签: asp.net webforms autofac


    【解决方案1】:

    为了解决请求范围内的问题,您应该使用IContainerProviderAccessorRequestLifetime 属性而不是ApplicatonContainer

    public static IList<RoleDto> GetRoles()
    {
        var cpa = ((IContainerProviderAccessor)HttpContext.Current.ApplicationInstance);
        var scope = cpa.RequestLifetime; 
    
        var biz = scope.Resolve<IRoleBiz>();
        return biz.GetRoles();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多