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
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
(Ya da ihmal) kullanmak için zaman var...
MySQL veritabanı enlem / boylam saklar...
Bunu kullanmak için Looper amacı nedir...
&Quot;Objective-C eşdeğer olabilirdi n...
Select *kullanmak için değil sebebi ne...