我已在Web.Config文件中注册了自定义MembershipProvider类。我使用Castle Windsor进行Inversion Of Control,我将自定义MembershipProvider类注册为瞬态(因为它使用的是瞬态服务)。
这意味着我希望在每个Web请求上重新创建成员资格提供程序实例。目前,每个应用程序域只创建一次,因此当它尝试访问它所依赖的服务时,该服务实例在不应该被重用时被重用。
现在我需要找到一种方法让Windsor控制我的自定义MembershipProvider的生命周期,但我不知道如何。我期待一个工厂坐在.NET Framework的某个地方,允许我覆盖实例创建并将其重新路由到Windsor,但我找不到任何相似内容。
顺便说一下,我正在使用.NET 4.0。
更新:以下是我的一些代码,以便您可以看到我正在做的事情:
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 :(得分:4)
我只是blogged about this有一个解决方案。
简而言之,此解决方案涉及一个简单,可重用的MembershipProvider,它调用容器来解析您的自定义MembershipProviders。与使用“BuildUp”容器功能的其他解决方案不同,这个实例可以实际控制实例化,从而实现构造函数注入(这反过来又可以实现不变性)和可代理性。
答案 1 :(得分:2)
不要担心您的MembershipProvider生命周期。只需管理提供程序中IMyService的生命周期。使用getter为您的IMyService创建一个属性,并在每次请求时返回一个新实例(或者您想要管理生命周期)。