我在我的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);
}
}
你能詳細說一下「控制壽命」嗎?你想達到什麼(具體)? – 2010-11-16 13:14:58
@Mauricio:我已經相應地更新了我的問題(在第一個段落後插入了一段)。 – 2010-11-16 13:29:41
我不確定我是否理解...如果您已將組件註冊爲臨時組件,則每次都會重新創建該組件,按照定義...您是否可以發佈註冊碼? – 2010-11-16 13:55:09