2017-09-06 60 views
0

已在Web Form應用程序中配置Autofac,如下所示。Autofac解析Web Form應用程序的靜態類中的類型

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應用程序期間看到此內容,它通常表示 表示按照Single-HTTP()組件(或類似方案)請求註冊的組件爲 。 在Web集成下,始終請求依賴關係解析器或請求生命週期範圍內的依賴項,而絕不會從 容器本身請求依賴項。

所以我的問題是,當生命週期範圍是「InstancePerRequest」時如何解決在asp.net web窗體應用程序中的靜態類中的註冊類型?

回答

0

爲了解決從請求範圍的東西,你應該使用IContainerProviderAccessor代替ApplicatonContainer

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

    var biz = scope.Resolve<IRoleBiz>(); 
    return biz.GetRoles(); 
} 
RequestLifetime財產