.net - 如何控制 MembershipProvider 实例的创建/生命周期?

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

我在我的 Web.Config 文件中注册了一个自定义 MembershipProvider 类。我正在使用 CaSTLe Windsor 使用控制反转,并且我已将自定义 MembershipProvider 类注册为 transient (因为它也使用 transient 服务)。

这意味着我希望在每个 Web 请求上重新创建 Membership 提供程序实例。目前,每个应用程序域只创建一次,因此当它尝试访问它所依赖的服务时,该服务实例会被重用,而它不应该被重用。

现在我需要找到一种方法让 Windsor 控制我的自定义 MembershipProvider 的生命周期,但我不知道如何。我希望在 .NET Framework 的某个地方有一个工厂,允许我覆盖实例创建并将其重新路由到 Windsor,但我找不到任何类似的东西。

顺便说一句,我使用的是 .NET 4.0。

更新:这是我的一些代码,所以你可以看到我在做什么:

网络配置:

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

成员(member)提供者
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);
    }
}

最佳答案

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

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

关于.net - 如何控制 MembershipProvider 实例的创建/生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4193484/

相关文章:

c# - 如何判断一个 IDisposable 对象引用是否被释放?

c# - 在对模型类应用Crud操作时,我在ASP.Net Mvc项目中出错

asp.net-mvc - 使用 PagedList 和成员资格

asp.net - 如何为 ASP.NET 身份设置密码规则?

c# - 如何在 Windows 上获取区分大小写的路径?

c# - C# 枚举标志必须是顺序的吗

.net - 无法在 WinDbg 中切换到托管线程

asp.net - MVC 3 直通路由

c# - 在 ASP.NET 5 中从 config.json 中检索部分

asp.net - 更改机器 key 会阻止现有用户登录