[C# 2.0] using vs. анонимный метод. Вызов методов Web Service-а

6yrop

На клменте объект-прокси вебсервиса имплементит IDispose, поэтому его надо использовать в конструкции usung.
 

using (RemoteFacade remoteFacade = new RemoteFacade
{
SetSomeProperties(remoteFacade);
string result = remoteFacade.Method1;
}

Методов у сервиса много, не хочется везде повторять 'using ... new ..' и 'SetSomeProperties'. Если использовать анонимные методы, то можно писать вот так
 

string result = null;
RemoteFacadeProvider.Do(
delegate(RemoteFacade remoteFacade)
{
status = remoteFacade.Method1;
});

Класс RemoteFacadeProvider
 

public class RemoteFacadeProvider
{
public delegate void Doer(RemoteFacade.RemoteFacade remoteFacade);

public static void Do(Doer doer)
{
using (RemoteFacade.RemoteFacade remoteFacade = new RemoteFacade.RemoteFacade
{
SetProperties(remoteFacade);
doer(remoteFacade);
}
}
}

Вопрос: стоит ли так делать? или это усложнение кода, а выгода небольшая. Может быть существует лучший вариант?
Слышал мнение, что новичку это будет сложно понять.

aleks058

Страшновато выглядит - кода много.
ИМХО, лучше будет такой промежуточный вариант:

using (RemoteFacade remoteFacade = RemoteFacadeFactory.GetInstance
{
string result = remoteFacade.Method1;
}


public class RemoteFacadeFactory
{
public RemoveFacade GetIsntance
{
RemoteFacade instance = new RemoteFacade;
SetProperties(instance);
return instance;
}
}

6yrop

первый недостаток этого кода — using покрывает не все эксепшены, которые возникают после
new RemoteFacade;  

В приведенном примере это может не так страшно, но не надо привыкать к плохому стилю.

aleks058

Можно в фабричном методе написать try/catch.

6yrop

Страшновато выглядит - кода много.
количество кода как раз равное

RemoteFacadeProvider.Do(delegate(RemoteFacade remoteFacade)
{
string result = remoteFacade.Method1;
});

using (RemoteFacade remoteFacade = RemoteFacadeFactory.GetInstance
{
string result = remoteFacade.Method1;
}

Но в первом варианте забыть использовать using нельзя.

Dasar

поменять код так:

public class RemoteFacadeFactory
{
public RemoveFacade GetIsntance
{
RemoteFacade instance = new RemoteFacade;
try
{
SetProperties(instance);
return instance;
}
catch
{
instance.Dispose;
throw;
}
}
}

6yrop

catch
{
instance.Dispose;
throw;
}
тут finally

apgrade

А зачем тебе постоянно создовать прокси-объект? Создал один раз, и вызывай его методы. Когда он тебе больше не нужен - явно вызови у него Dispose.

Dasar

если уж делать анонимный делегат, то вызов делать так:

string result = RemoteFacadeProvider.Do(
delegate(RemoteFacade remoteFacade)
{
return remoteFacade.Method1;
});

соответственно в трешке будет:

string result = RemoteFacadeProvider.Do(remoteFacade => remoteFacade.Method1;

Dasar

> тут finally
Ты что? какой finally?
если все хорошо объект надо отдать, а не убить

aleks058

Да, пожалуй, что очень похожий код.
Но мой вариант для меня привычнее.

6yrop

если все хорошо объект надо отдать, а не убить
да, извиняюсь, стормозил

6yrop

code:
RemoteFacadeProvider.Do(delegate(RemoteFacade remoteFacade)
{
string result = remoteFacade.Method1;
});
using (RemoteFacade remoteFacade = RemoteFacadeFactory.GetInstance
{
    string result = remoteFacade.Method1;
}
я вижу только небольшой недостаток первого метода. Если выход из внешнего метода происходит внутри using
 

string f
{
using (RemoteFacade remoteFacade = RemoteFacadeFactory.GetInstance
{
return remoteFacade.Method1;
}
}

или
 

string result = null;
RemoteFacadeProvider.Do(delegate(RemoteFacade remoteFacade)
{
result = remoteFacade.Method1;
});
return result;

6yrop

Да, пожалуй, что очень похожий код.
Но мой вариант для меня привычнее.
ты предпочитаешь привычный, но менее безопасный?

Dasar

я бы еще рассмотрел вариант - просто нагенерить статических методов заглушек.

aleks058

В чем заключается меньшая безопасность?

6yrop

В чем заключается меньшая безопасность?
не забудешь using. Точнее даже не надо помнить, что его надо использовать.

aleks058

Я вот тут подумал... Спасибо за идею!
Оставить комментарий
Имя или ник:
Комментарий: