Как мне управлять созданием / временем жизни экземпляра MembershipProvider?
Я зарегистрировал пользовательский класс MembershipProvider в своем файле Web.Config. Я использую Inversion Of Control, используя Castle Windsor, и я зарегистрировал свой пользовательский класс MembershipProvider как временный (поскольку он также использует временный сервис).
Это означает, что я хочу, чтобы экземпляр поставщика членства создавался заново при каждом веб-запросе. В настоящее время он создается только один раз для домена приложения, поэтому, когда он пытается получить доступ к службе, он зависит от того, используется ли этот экземпляр службы в то время, когда он не должен.
Теперь мне нужно найти способ, чтобы Виндзор управлял временем жизни моего пользовательского MembershipProvider, но я не знаю как. Я ожидал, что где-нибудь в.NET Framework будет сидеть фабрика, которая позволит мне переопределить создание экземпляра и перенаправить его в Виндзор, но я не могу найти ничего похожего.
Кстати, я использую.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 ответа
Я только что написал об этом с решением.
В двух словах, это решение включает в себя простой многократно используемый MemberhipProvider, который вызывает контейнер для разрешения ваших пользовательских MembershipProvider. В отличие от других решений, в которых используются функции контейнера "BuildUp", это решение обеспечивает подлинный контроль над созданием экземпляров, что позволяет внедрять конструктор (что, в свою очередь, обеспечивает неизменяемость) и проксируемость.
Не беспокойтесь о вашей жизни в MembershipProvider. Просто управляйте временем жизни IMyService внутри провайдера. Создайте свойство для вашего IMyService с помощью геттера и возвращайте новый экземпляр (или, тем не менее, вы хотите управлять временем жизни) каждый раз, когда он запрашивается.