2013-07-22 27 views
1

我剛開始使用Autofac和我有以下代碼:Autofac和WebForms - 傳遞非常量參數,解析參數?

public class _default : System.Web.UI.Page, IUserInformationProvider 
{ 
    protected void Page_Load(object sender, System.EventArgs e) 
    { 
     ControllerFactory cf; 
     using (scope == ((Global_asax)this.Context.ApplicationInstance).ContainerProvider.ApplicationContainer.BeginLifetimeScope()) { 
      cf = scope.Resolve<IControllerFactory>(); // <-- would love to pass "this" somewhere here, but how??? 
     } 
    } 

} 

的ControllerFactory如下定義,還需要一個IUserInformationProvider接口。我想將WebForm的實例作爲參數傳遞給Resolve IControllerFactory。

public class ControllerFactory : IControllerFactory 
{ 
    protected IUserInformationProvider _userInformation; 
    public ControllerFactory(IUserInformationProvider userInformation) 
    { 
     _userInformation = userInformation; 
    } 
} 

查看文檔,我發現有3個參數類型(命名,類型,已解決),但前2個只採用常量值。看起來Resolved參數是要走的路,但我對如何實現它有點失落,或者即使這是正確的策略。那麼builder.Register會是什麼樣子?

回答

0

您不僅可以在註冊時傳遞附加參數,還可以在解析類型時傳遞附加參數。

ResolvedParameter只有在您的IUserInformationProvider已被註冊到容器中才能使用,因此它可能不適用於您的情況。

但是,你需要通過參數名已在contrustor所以"userInformation"和值this用什麼,你可以使用NamedParameter

cf = scope.Resolve<IControllerFactory>(
    new NamedParameter("userInformation", this)); 

或者你可以使用TypedParameter,你需要通過在這種情況下typeof(IUserInformationProvider)參數並再次this值類型:

cf = scope.Resolve<IControllerFactory>(
    new TypedParameter(typeof(IUserInformationProvider), this)); 

如果你正在尋找一些一般指導你如何能整合的WebForms與Autofac你可以用documentation

0
開始

通過在控制器中引入財產依賴打破依賴循環:

public class ControllerFactory : IControllerFactory 
{ 
    public ControllerFactory() { } 

    // Property dependency (part of IControllerFactory interface) 
    public IUserInformationProvider UserInformation { get; set; } 
} 

這樣你就可以設置的值Autofac構建了後類型:

var factory = scope.Resolve<IControllerFactory>(); 
factory.UserInformation = this; 
cf = factory; 
+0

是啊,但你變成了'UserInformation'成一個可選的依賴,現在在'ControllerFactory'的每一個方法,你會用理論'UserInformation'你需要檢查PROPERT y不是'null' ... – nemesv