SORU
21 ŞUBAT 2009, CUMARTESİ


Bisiklet Federasyonu istemci `` blok sorunu kullanmak için en iyi çözüm nedir?

Hemen hemen IDisposable uygulayan kaynaklarını kullanmak için standart bir yol gibi using bir blok içinde XML servisi müşterilerim başlatmasını istiyorum:

using (var client = new SomeWCFServiceClient()) 
{
    //Do something with the client 
}

Ama, belirtildiği gibi this MSDN article, kaydırma XML istemci bir using blok maskesi hataları neden müşteri sola bir hata durumu (gibi bir zaman aşımı ya da iletişim sorunu). Ne zaman İmha() uzun lafın kısası, müşterinin Yakın denir() yöntemi, yangınlar, ama hatalı bir durumda olduğu için bir hata atar. Orijinal durum sonra ikinci durum maskelenmiş olur. İyi değil.

Web makalede önerilen çözüm tamamen using bir blok kullanarak, ve yerine müşterileriniz oluşturmak ve bu gibi bir şey: onları kullanmaktan kaçının

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

using blok göre, o çirkin bence. Ve bir müşteri her zaman yazmak için bir sürü kod.

Neyse ki, IServiceOriented bir kaç geçici çözüm olarak buldum. İle başlar:

public delegate void UseServiceDelegate<T>(T proxy); 

public static class Service<T> 
{ 
    public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>(""); 

    public static void Use(UseServiceDelegate<T> codeBlock) 
    { 
        IClientChannel proxy = (IClientChannel)_channelFactory.CreateChannel(); 
        bool success = false; 
        try 
        { 
            codeBlock((T)proxy); 
            proxy.Close(); 
            success = true; 
        } 
        finally 
        { 
            if (!success) 
            { 
                proxy.Abort(); 
            } 
        } 
     } 
} 

O zaman izin verir:

Service<IOrderService>.Use(orderService => 
{ 
    orderService.PlaceOrder(request); 
}); 

O kadar da kötü değil, ama o kadar etkileyici ve using blok olarak kolayca anlaşılabilir olduğunu sanmıyorum.

Şu anda ben kullanmaya çalışıyorum geçici ilk blog.davidbarret.net hakkında bilgi edinin. Temelde istemci kullanmak her yerde Dispose() Bu yöntemi geçersiz kılar. Gibi bir şey

public partial class SomeWCFServiceClient : IDisposable
{
    void IDisposable.Dispose() 
    {
        if (this.State == CommunicationState.Faulted) 
        {
            this.Abort();
        } 
        else 
        {
            this.Close();
        }
    }
}

Bu durumu yine hatalı bir durum maskeleme tehlikesi olmadan using engellemek mümkün görünüyor.

Diğer sorunlar ben bu geçici çözümler kullanmak için dışarı bakmak zorunda olan var mı? Herkes daha iyi bir şey ile geldi?

CEVAP
21 ŞUBAT 2009, CUMARTESİ


26 ** da olsa, aslında, (Luke's answer), 28* (see alternative link) *IDisposable benim sarıcı daha iyi olduğunu düşünüyorum. Tipik kod:

Service<IOrderService>.Use(orderService=>
{
  orderService.PlaceOrder(request);
}

(yorum başına edit)

Use döndüğü boşluk, dönüş değerleri işlemek için en kolay yolu yakalanan bir değişken)

int newOrderId = 0; // need a value for definite assignment
Service<IOrderService>.Use(orderService=>
  {
    newOrderId = orderService.PlaceOrder(request);
  });
Console.WriteLine(newOrderId); // should be updated

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • Chip Johnson

    Chip Johnson

    30 AĞUSTOS 2007
  • PaulGBelliveau

    PaulGBellive

    5 Mart 2009