更好的客户端Web服务

时间:2012-07-13 11:23:34

标签: c# web-services asynchronous xamarin.ios client

我正在使用C#和MonoTouch为Web服务编写客户端应用程序。它有一些用于用户会话(注册,登录,注销),消息传递(列表,写入,删除等),图像例程(上传,下载)等的命令。

我编写了用户会话请求类型的实现,可以异步执行,如:

{
    public delegate void LoginEventHandler(Session session);
    public delegate void ErrorEventHandler(Error error);
    public delegate void StatusEventHandler(string status);

        public interface IDataProvider
        {
            #region Session
            Session GetSession();

            event LoginEventHandler OnRegistered;
            event ErrorEventHandler OnRegisteredError;
            void Register(Person user);

            event LoginEventHandler OnLoggedIn;
            event ErrorEventHandler OnLoggedInError;
            void Login(Person user);

            event StatusEventHandler OnLoggedOut;
            event ErrorEventHandler OnLoggedOutError;
            void Logout(Session session);
            #endregion
        }
    }
}

它有效,但即使现在它有点无聊和弱来实现2个事件处理程序,以后可以取消订阅任何请求:

dataProvider = new DataProviderService ();
...
appDelegate.dataProvider.OnRegistered += HandleOnRegistered;
appDelegate.dataProvider.OnRegisteredError += HandleOnRegisteredError;
appDelegate.dataProvider.Register(GetPerson());
...
void HandleOnRegistered (Session session)
{
    InvokeOnMainThread(delegate {
        appDelegate.settings.Session = session;

        appDelegate.dataProvider.OnRegistered -= HandleOnRegistered;
        appDelegate.dataProvider.OnRegisteredError -= HandleOnRegisteredError;

        Waiter.HideWaiter();
        Console.WriteLine(session.userId);
    }
    );
}

void HandleOnRegisteredError (Error error)
{
    InvokeOnMainThread(delegate {
        appDelegate.dataProvider.OnRegistered -= HandleOnRegistered;
        appDelegate.dataProvider.OnRegisteredError -= HandleOnRegisteredError;

        Console.WriteLine(error);
    });
}    

是否有任何改善架构以进一步开发的建议?或任何材料,以了解大师通常如何做?

1 个答案:

答案 0 :(得分:1)

一般来说,我构建这类事物的方式是:

  • 延迟加载我的控制器
  • 每个控制器都是应用程序中的单例,并且在应用程序的生命周期内保持不变(我使用IoC容器,但您不必这样做)
  • 将您的WCF服务(或频道)设为单身
  • 在每个控制器的构造函数中订阅类似这样的事件
  • 妥善处理ViewDidLoadViewDidUnload,以便在内存不足的情况下释放大部分内存
  • 检查IsViewLoaded或事件中的可见性等,以确定是否需要处理事件

您可以取消订阅Dispose以获得良好衡量标准,但不需要。