Передо мной встала задача, нужно было бы собрать все события объекта и подписаться на них (подписать определенный метод), только в том случае, если на это событие не подписан кто-то еще. Я могу даже больше сказать, делал я это для классов-оберток, которые генерирует Visual Studio на Add Reference Service…. Используем мы их по стандартному, как и все, наверное. Используем в коде не сами классы-обертки, которые генерирует Visual Studio, а используем свои реализации, которые нам предоставляют возможность тестировать наши модели, подставляя Mock и Stub объекты вместо самих реализаций. Давайте лучше покажу на примере.
Заголовок для этой заметки достаточно сложно было придумать. Проверка наличия подписчиков – это все-таки малая сердцевина того, что я тут описываю, но я думаю это просто самая интересная часть. В целом, я тут описываю вариант обработки результатов от методов сервисов в Silverlight приложении.
Пускай на сервере есть самый обычный WCF Service, в котором есть всего один метод:
public class MyService : IMyService
{
public bool DoWork(string str)
{
throw new NotImplementedException();
}
}
В Silverlight проекте мы сделаем Reference на этот сервис. Visual Studio сгенерирует нам класс обертку. Напишем небольшой базовый метод для всех клиентских классов-оберток для сервисов:
public abstract class ServiceBase<TClient> where TClient : class, new()
{
protected ServiceBase()
{
Client = new TClient();
} public TClient Client { get; set; } protected void ProcessResult<T>(AsyncCompletedEventArgs eventArgs, T result)
{
Action<AsyncResult<T>> action = eventArgs.UserState as Action<AsyncResult<T>>; if (action == null)
throw new NotSupportedException("Unexpected type in UserState."); action(new AsyncResult<T>() { Result = result });
} protected void ProcessResult(AsyncCompletedEventArgs eventArgs)
{
Action<AsyncResult> actionVoidResponce = eventArgs.UserState as Action<AsyncResult>; if (actionVoidResponce == null)
throw new NotSupportedException("Unexpected type in UserState.");
actionVoidResponce(new AsyncResult());
} protected void ProcessError<T>(AsyncCompletedEventArgs eventArgs)
{
Action<AsyncResult<T>> action = eventArgs.UserState as Action<AsyncResult<T>>; if (action == null)
throw new NotSupportedException("Unexpected type in UserState."); action(new AsyncResult<T>() { Exception = eventArgs.Error });
}
Read more: outcoldman
Заголовок для этой заметки достаточно сложно было придумать. Проверка наличия подписчиков – это все-таки малая сердцевина того, что я тут описываю, но я думаю это просто самая интересная часть. В целом, я тут описываю вариант обработки результатов от методов сервисов в Silverlight приложении.
Пускай на сервере есть самый обычный WCF Service, в котором есть всего один метод:
public class MyService : IMyService
{
public bool DoWork(string str)
{
throw new NotImplementedException();
}
}
В Silverlight проекте мы сделаем Reference на этот сервис. Visual Studio сгенерирует нам класс обертку. Напишем небольшой базовый метод для всех клиентских классов-оберток для сервисов:
public abstract class ServiceBase<TClient> where TClient : class, new()
{
protected ServiceBase()
{
Client = new TClient();
} public TClient Client { get; set; } protected void ProcessResult<T>(AsyncCompletedEventArgs eventArgs, T result)
{
Action<AsyncResult<T>> action = eventArgs.UserState as Action<AsyncResult<T>>; if (action == null)
throw new NotSupportedException("Unexpected type in UserState."); action(new AsyncResult<T>() { Result = result });
} protected void ProcessResult(AsyncCompletedEventArgs eventArgs)
{
Action<AsyncResult> actionVoidResponce = eventArgs.UserState as Action<AsyncResult>; if (actionVoidResponce == null)
throw new NotSupportedException("Unexpected type in UserState.");
actionVoidResponce(new AsyncResult());
} protected void ProcessError<T>(AsyncCompletedEventArgs eventArgs)
{
Action<AsyncResult<T>> action = eventArgs.UserState as Action<AsyncResult<T>>; if (action == null)
throw new NotSupportedException("Unexpected type in UserState."); action(new AsyncResult<T>() { Exception = eventArgs.Error });
}
Read more: outcoldman
0 comments:
Post a Comment