Как мне управлять созданием / временем жизни экземпляра MembershipProvider? - PullRequest
6 голосов
/ 16 ноября 2010

Я зарегистрировал пользовательский класс MembershipProvider в моем файле Web.Config. Я использую Inversion Of Control, используя Castle Windsor, и я зарегистрировал свой пользовательский класс MembershipProvider как временный (поскольку он также использует временный сервис).

Это означает, что я хочу, чтобы экземпляр поставщика членства создавался заново при каждом веб-запросе. В настоящее время он создается только один раз для домена приложения, поэтому, когда он пытается получить доступ к службе, он зависит от того, используется ли этот экземпляр службы в то время, когда он не должен.

Теперь мне нужно найти способ, чтобы Виндзор управлял временем жизни моего пользовательского 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 ]

4 голосов
/ 18 ноября 2010

Я только что написал об этом с решением.

В двух словах, это решение включает в себя простой многократно используемый MemberhipProvider, который вызывает контейнер для разрешения ваших пользовательских MembershipProviders. В отличие от других решений, в которых используются функции контейнера «BuildUp», оно обеспечивает реальный контроль над созданием экземпляров, что позволяет внедрять конструктор (что, в свою очередь, обеспечивает неизменяемость) и проксибельность.

2 голосов
/ 16 ноября 2010

Не беспокойтесь о продолжительности жизни вашего MembershipProvider. Просто управляйте временем жизни IMyService внутри провайдера. Создайте свойство для вашего IMyService с помощью получателя и возвращайте новый экземпляр (или, тем не менее, вы хотите управлять временем жизни) каждый раз, когда он запрашивается.

...