6

我在我的Web.Config文件中註冊了一個自定義MembershipProvider類。我正在使用Castle Windsor使用Inversion Of Control,我將自定義的MembershipProvider類註冊爲transient(因爲它使用的是暫時的服務)。如何控制MembershipProvider實例創建/生命週期?

這意味着我希望在每個Web請求上重新創建成員資格提供程序實例。目前,它僅在每個應用程序域創建一次,因此當它試圖訪問它所依賴的服務時,該服務實例將被重用,而不應該這樣做。

現在我需要找到讓Windsor控制我的自定義MembershipProvider的生命週期的方法,但我不知道如何。我期望一個坐在.NET Framework中某個工廠的工廠,允許我重寫實例創建並將其重新路由到Windsor,但我找不到任何相似的東西。

順便說一句,我使用.NET 4.0。

UPDATE:下面是我的一些代碼,所以你可以看到我在做什麼確切:

的Web.Config:

<membership defaultProvider="MyMembershipProvider" > 
    <providers> 
    <clear/> 
    <add name="ApplicationMembershipProvider" 
     type="MyNamespace.MyMembershipProvider, MyAssembly"/> 
    </providers> 
</membership> 

成員資格提供

public class MyMembershipProvider : MembershipProvider 
{ 
    private IMyService myService; 

    public MyMembershipProvider() : base() 
    { 
     // We should use constructor injection here but since we cannot control 
     // the construction of this class, we're forced to create the dependency 
     // ourselves. 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     if (myService == null) 
     { 
      // This scope is only reached once within the browser session, 
      // ASP.NET keeps the instance of MyMembershipProvider in memory 
      // so the myService field keeps its value across web requests. 
      // This results in Castle Windsor (which I have configured the service 
      // locator to use) not being able to control the lifetime of 
      // the MyService instance. So, the inability of Windsor to control 
      // the lifetime of MembershipProvider instances, inhibits the lifetime 
      // management of MyService instances as well. 
      myService = ServiceLocator.Current.GetInstance<IMyService>(); 
     } 

     return myService.ValidateUser(username, password); 
    } 
} 
+0

你能詳細說一下「控制壽命」嗎?你想達到什麼(具體)? – 2010-11-16 13:14:58

+0

@Mauricio:我已經相應地更新了我的問題(在第一個段落後插入了一段)。 – 2010-11-16 13:29:41

+0

我不確定我是否理解...如果您已將組件註冊爲臨時組件,則每次都會重新創建該組件,按照定義...您是否可以發佈註冊碼? – 2010-11-16 13:55:09

回答

4

我只是blogged about this與解決方案。

簡而言之,此解決方案涉及一個簡單的可重複使用的MembershipProvider,它調用容器來解析您的自定義MembershipProvider。與其他使用「BuildUp」容器功能的解決方案不同,這個解決方案需要對實例化進行真正的控制,從而支持構造器注入(從而實現不變性)和可代理性。

+0

這正是我需要的。非常感謝! – 2010-11-23 08:59:53

+0

我有一個問題:什麼決定推動釋放或不釋放重寫的WindsorMembershipProvider類成員中的容器之間的選擇? – 2010-11-23 09:24:00

+0

@Sandor:已解決的組件以所有方法發佈。有關基本原理,請參閱http://devlicio.us/blogs/krzysztof_kozmic/archive/2010/08/27/must-i-release-everything-when-using-windsor.aspx。 – 2010-11-23 13:31:41

2

不要擔心您的MembershipProvider生活我。只需管理提供程序中IMyService的生命週期即可。用getter爲你的IMyService創建一個屬性,並在每次請求時返回一個新的實例(或者你想管理這個生命週期)。

+0

感謝您的建議。然而,我的觀點是,我不應該管理對象的生命週期,而是讓Castle Windsor根據我交給它的生命週期配置來做這件事(控制反轉)。 – 2010-11-16 21:35:56

+0

好。你可以做到這一點。全部來自您的MembershipProvider類。只需要一個返回IMyservice的屬性 - 這將簡單地返回從您的IoC容器返回的任何內容。 – Pedro 2010-11-16 22:24:51

+0

是的,但這會導致每次在同一個Web請求中調用MembershipProvider時都會創建該服務。我可以在一定程度上與此相適應,但目標是讓溫莎城堡管理一生,而不是我。 – 2010-11-17 13:33:21