SORU
19 Temmuz 2009, Pazar


Tek Başına bir Çağrı İçeriği (Web İsteği) Birlik içinde

Birkaç gün önce ASP.NET iş parçacığı ile bu sorunu yaşadım. Web isteği doğrultusunda tek bir nesne olmasını istedim. Aslında benim iş birimi için bu gerekiyor. Kimlik göster ile isteği dışında geçerli web isteği başına iş birimi oluşturmak istedim. Bu şekilde depo derslerim için kendi İUnitOfWork enjekte etmek için bir IoC şeffaf bir şekilde kullanabilirim, ve sorgu için aynı örneği kullanmak ve benim varlık update ettim.

Birlik kullanıyorum beri, ben de yanlışlıkla PerThreadLifeTimeManager kullanılır. Ben yakında ASP.NET iş parçacığı modeli elde etmek istiyorum ne desteklemeyen fark etti. Bir theadpool kullanır ve konuları geri dönüşüme temel olarak, bu iş parçacığı başına bir UnitOfWork almak anlamına gelir!! Ne istediğimi ancak web isteği başına iş birimi oldu.

Biraz googling beni this great post verdi. Bu; başarmak için oldukça kolay olan birlik kısmı dışında tam istediğim gibi oldu.

Bu birlik için PerCallContextLifeTimeManager için benim uygulamasıdır:

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()
    {
    }
}

Ve tabii ki bu bir buna benzer bir kod ile iş birliğim kaydetmek için kullanın:

unityContainer
            .RegisterType<IUnitOfWork, MyDataContext>(
            new PerCallContextLifeTimeManager(),
            new InjectionConstructor());

Birisi biraz zaman kazandırır umarım.

CEVAP
10 HAZİRAN 2010, PERŞEMBE


Zarif çözüm, ama LifetimeManager her örneği bir sabit yerine: benzersiz bir anahtar kullanmak gerekir

private string _key = string.Format("PerCallContextLifeTimeManager_{0}", Guid.NewGuid());

Eğer birden fazla nesne PerCallContextLifeTimeManager kayıtlı aksi takdirde, erişim CallContext için aynı anahtarı paylaşıyorlar ve beklenen nesne geri alamazsın.

Ayrıca RemoveValue nesneleri temizlediğini sağlamak için uygulamaya değer:

public override void RemoveValue()
{
     CallContext.FreeNamedDataSlot(_key);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amir Parmar

    Amir Parmar

    25 Kasım 2010
  • FF Radio

    FF Radio

    16 Mayıs 2008
  • Justin Schenck

    Justin Schen

    24 Kasım 2006