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

San*_*zen 6 .net asp.net castle-windsor asp.net-membership inversion-of-control

我在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>
Run Code Online (Sandbox Code Playgroud)

会员提供者

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Mau*_*fer 4

我刚刚在博客中介绍了这个问题并提供了解决方案。

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