【问题标题】:Better client side of web-service更好的 Web 服务客户端
【发布时间】:2012-07-13 05:56:51
【问题描述】:

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

对改进架构以促进进一步发展有何建议?或者有什么资料可以看看大师平时是怎么做的?

【问题讨论】:

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


    【解决方案1】:

    通常我构建这类东西的方式:

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

    您可以在Dispose 中取消订阅,但这不是必需的。

    【讨论】:

    • 如果我理解正确,通常您使用的是相同的东西,但需要额外检查对事件处理程序的双重签名。
    • 如果你的控制器真的是单例的,那么检查你是否订阅了两次事件是没有用的。
    猜你喜欢
    • 2014-09-04
    • 2013-02-03
    • 2010-11-09
    • 2010-09-17
    • 2020-10-23
    • 2013-06-29
    • 2011-01-06
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多