C# Xamarin初始化顺序

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

在我的Xamarin.Forms项目中,我有一个名为
数据存储
的中心数据模型,它从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
        }
    }
}