0

我正在使用 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);
    });
}    

有什么建议可以改进架构以促进进一步发展吗?或者任何材料来看看大师通常是如何做的?

4

1 回答 1

1

一般来说,我设计这种东西的方式是:

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

您可以取消订阅以Dispose取得良好的效果,但这不是必需的。

于 2012-07-13T16:38:53.637 回答