在应用程序的整个生命周期中保持服务活动
Keeping a service alive throughout the lifetime of the application
我有一个简单的服务接口,用于通过 HTTP 与服务器同步数据。服务接口有一个方法来启动和停止同步过程。这个想法是在用户登录后启动同步过程,并在用户注销前在应用程序结束时停止同步。同步服务将每隔几分钟检查一次新消息,然后使用 MvxMessenger 插件将 new/changed 数据通知 ViewModel。
确保同步服务在应用程序期间有效的推荐方法是什么?我目前正在使用自定义 IMvxAppStart,它将服务接口注册为单例,然后持有对服务接口的静态引用。这足以让服务在应用程序的生命周期内保持活动状态,还是有更好的方法?
public class App : MvxApplication
{
public override void Initialize()
{
...
RegisterAppStart(new CustomAppStart());
}
}
public class CustomAppStart : MvxNavigatingObject, IMvxAppStart
{
public static ISyncClient SynchronizationClient { get; set; }
public void Start(object hint = null)
{
SynchronizationClient = Mvx.Resolve<ISyncClient>();
ShowViewModel<SignInViewModel>();
}
}
public interface ISyncClient
{
void StartSync();
void StopSync();
bool IsSyncActive { get; }
}
为此您不需要静态 属性。当您将接口注册为单例时,IoC 会为您完成工作。示例:在我们的一个应用程序中,我们需要一个状态 属性,其中包含应用程序整个生命周期的重要数据。
需要此状态的模型,只需使用以下代码片段:
protected IApplicationState AppState
{
get { return _appstate ?? (_appstate = Mvx.GetSingleton<IApplicationState>()); }
}
private IApplicationState _appstate;
但是:您也可以使用静态 属性 来完成。但在这种情况下,您不需要 IoC 中的单例值。
我有一个简单的服务接口,用于通过 HTTP 与服务器同步数据。服务接口有一个方法来启动和停止同步过程。这个想法是在用户登录后启动同步过程,并在用户注销前在应用程序结束时停止同步。同步服务将每隔几分钟检查一次新消息,然后使用 MvxMessenger 插件将 new/changed 数据通知 ViewModel。
确保同步服务在应用程序期间有效的推荐方法是什么?我目前正在使用自定义 IMvxAppStart,它将服务接口注册为单例,然后持有对服务接口的静态引用。这足以让服务在应用程序的生命周期内保持活动状态,还是有更好的方法?
public class App : MvxApplication
{
public override void Initialize()
{
...
RegisterAppStart(new CustomAppStart());
}
}
public class CustomAppStart : MvxNavigatingObject, IMvxAppStart
{
public static ISyncClient SynchronizationClient { get; set; }
public void Start(object hint = null)
{
SynchronizationClient = Mvx.Resolve<ISyncClient>();
ShowViewModel<SignInViewModel>();
}
}
public interface ISyncClient
{
void StartSync();
void StopSync();
bool IsSyncActive { get; }
}
为此您不需要静态 属性。当您将接口注册为单例时,IoC 会为您完成工作。示例:在我们的一个应用程序中,我们需要一个状态 属性,其中包含应用程序整个生命周期的重要数据。
需要此状态的模型,只需使用以下代码片段:
protected IApplicationState AppState
{
get { return _appstate ?? (_appstate = Mvx.GetSingleton<IApplicationState>()); }
}
private IApplicationState _appstate;
但是:您也可以使用静态 属性 来完成。但在这种情况下,您不需要 IoC 中的单例值。