C# Xamarin初始化顺序
在我的Xamarin.Forms项目中,我有一个名为C# Xamarin初始化顺序,c#,xamarin,xamarin.forms,xamarin.ios,initialization,C#,Xamarin,Xamarin.forms,Xamarin.ios,Initialization,在我的Xamarin.Forms项目中,我有一个名为数据存储的中心数据模型,它从web套接字永久检索JSON数据,将其转换为对象,并将其存储在字典中。我需要从多个视图模型和视图访问此数据存储。为了实现这一目标,我做了以下工作: [assembly: XamlCompilation(XamlCompilationOptions.Compile)] namespace Foo { public partial class App : Application { pub
数据存储
的中心数据模型,它从web套接字永久检索JSON数据,将其转换为对象,并将其存储在字典
中。我需要从多个视图模型和视图访问此数据存储
。为了实现这一目标,我做了以下工作:
[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Foo
{
public partial class App : Application
{
public DataStore dataStore { get; }
public static App current = (App)Application.Current;
public App()
{
InitializeComponent();
dataStore = new DataStore();
MainPage = new MainPage();
}
}
}
而数据存储
本身有以下事件:
namespace Foo
{
public class DataStore
{
Dictionary<int, Target> targetDict;
public EventHandler<Target> targetAdded;
public EventHandler<Target> targetRemoved;
}
}
然而,我遇到了空指针异常,这告诉我初始化顺序有问题
问题是:
如果需要从多个视图模型和视图访问中心数据层组件,那么“Xamarin”在何处以及如何初始化中心数据层组件,如数据存储
?你能让它静止吗
任何暗示都非常感谢 根据我对你问题的理解,你有两个选择 1) 从您的数据存储中创建一个单件(因此是一个静态属性),使其在应用程序中的任何位置都可用 2) 对数据存储进行抽象,并在启动时注入该抽象(更好的解决方案imo) 但是,无论您选择什么解决方案,您仍然会遇到初始化问题。
(在viewmodels中)您应该做的是,在尝试访问任何数据之前,如有必要,调用数据存储方法对其进行初始化。谢谢!你的第二种方法听起来很有前途,但我不太明白。我认为“抽象”是指添加一个更抽象的超类,但它对我有什么帮助?我还不理解“注入”部分。所谓“抽象”,我的意思是让您的数据存储实现一个接口,比如“IDataStore”。当您的对象实现该接口时,您可以使用IoC(控制反转)库,该库将允许您使用其接口将数据存储“注入”到任何viewmodels中。这样,如果将来需要的话,您可以用DataStore2(同时仍然实现IDataStore接口)替换您的数据存储,并且您的应用程序中的任何地方都不需要进行重构。IoC是Xamarin中最常用和最有用的工具之一,如果可以的话,您应该查看它。为了清楚起见,IoC不是Xamarin特有的。只是我们在Xamarin项目中经常使用它,因为技术的跨平台方面,我知道IoC,我以前在各种项目中使用过它。然而,我来自C++背景(因此是小写方法和成员名称),这在我的脑海中提出了一个新问题:如何在接口中使用C事件?接口可以有EventHandler吗?或者我应该创建像
subscribeToXXX(回调)
这样的方法吗?是的,我肯定会这样做
namespace Foo
{
public class TargetMap : Map
{
public List<CustomPin> customPins { get; set; }
public TargetMap() : base()
{
customPins = new List<CustomPin>();
App.current.dataStore.targetAdded += onTargetAdded;
App.current.dataStore.targetRemoved += onTargetRemoved;
}
void onTrackRemoved(object sender, Target t)
{
// Do stuff
}
void onTrackAdded(object sender, Track t)
{
// Do stuff
}
}
}