如何控制MembershipProvider实例创建/生命周期?

时间:2010-11-16 11:06:33

标签: .net asp.net asp.net-membership inversion-of-control castle-windsor

我已在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);
    }
}

2 个答案:

答案 0 :(得分:4)

我只是blogged about this有一个解决方案。

简而言之,此解决方案涉及一个简单,可重用的MembershipProvider,它调用容器来解析您的自定义MembershipProviders。与使用“BuildUp”容器功能的其他解决方案不同,这个实例可以实际控制实例化,从而实现构造函数注入(这反过来又可以实现不变性)和可代理性。

答案 1 :(得分:2)

不要担心您的MembershipProvider生命周期。只需管理提供程序中IMyService的生命周期。使用getter为您的IMyService创建一个属性,并在每次请求时返回一个新实例(或者您想要管理生命周期)。