Kilka dni temu miałem ten problem z gwintowaniem ASP.Net. Chciałem mieć obiekt singleton na żądanie internetowe. Potrzebuję tego dla mojej jednostki pracy. Chciałem utworzyć jednostkę pracy na żądanie internetowe, aby mapa tożsamości była ważna przez żądanie. W ten sposób mógłbym użyć IoC do przezroczystego wstrzyknięcia mojej własnej klasy IUnitOfWork do moich klas repozytorium i mogłem użyć tej samej instancji do zapytania, a następnie aktualizacji moich encji.Singleton Per Call Context (Web Request) w Unity
Ponieważ używam Unity, błędnie użyłem PerThreadLifeTimeManager. Wkrótce zdałem sobie sprawę, że model gwintowania ASP.Net nie obsługuje tego, co chcę osiągnąć. Zasadniczo używa on theadpool i przetwarza wątki, a to oznacza, że otrzymuję jeden UnitOfWork na wątek !! Jednak potrzebowałem jednej jednostki pracy na żądanie strony internetowej.
Trochę googlowania dało mi this great post. Dokładnie tego chciałem; z wyjątkiem części jedności, która była dość łatwa do osiągnięcia.
To moja realizacja dla PerCallContextLifeTimeManager jedności:
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
I oczywiście to wykorzystać, aby zarejestrować jednostkę pracy z kodem podobnym do tego:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
nadzieję, że ratuje kogoś trochę czasu.
Ładne rozwiązanie. Jeśli mogę, polecam zmianę nazwy tego na "CallContextLifetimeManager", ponieważ żądania internetowe są prawdopodobnie tylko jedną z potencjalnych aplikacji. –
To prawda, zaktualizowałem tekst i kod, aby to odzwierciedlić. Dzięki. –
+1 Bardzo pomocny. – MrDustpan