Ich habe einen Singleton wie folgt definiert:Bei Verwendung eines Singleton-Musters sollte meine öffentliche Klasse die private oder öffentliche Instanz zurückgeben?
public partial class MoonDataManager
{
static MoonDataManager _singletonInstance;
public static MoonDataManager SingletonInstance
{
get
{
return _singletonInstance;
}
private set
{
_singletonInstance = value;
}
}
Ich habe eine Funktion, die die Instanz sicher erstellt:
public static async Task<MoonDataManager> CreateSingletonAsync()
{
_singletonInstance = new MoonDataManager();
Sollte ich:
return _singletonInstance; (field)
oder
return SingletonInstance; (property)
Ich bin besorgt über Garbage Collection, vor allem in iOS oder Android innerhalb von Xamarin.
Auch wenn es in C# Namensmuster gibt, lassen Sie mich wissen, wenn ich von einem Standard abgewichen bin.
Update:
Jetzt denke ich, dass ich mich wirklich mit Threading und asynchroner Methoden stecken geblieben. Hier sind die Objekte und ihre Ziele:
MoonDataManager
: Führen Sie dieRegisterTable<Models.IssuerKey>
einmal pro Tisch. Dies ist eine generische Methode, die im Wesentlichen läuft(new MobileServiceSQLiteStore).DefineTable<T>()
OfflineStore
: Dies ist einMobileServiceSQLiteStore
.MobileClient
: Dies ist einMobileServiceClient
.MoonDataManager
Abhängigkeiten: Der MoonDataManager benötigt OfflineStore und MobileClient, um die Initialisierung zu beenden. Insbesondere tut es einMobileServiceClient
.SyncContext.InitializeAsync (OfflineStore
)
Ich bin nicht sicher, wie Sinn dieser Spaghetti von Abhängigkeiten zu machen ... oder wie Sie den Code machen schön aussehen und sicher Thread .
Hier ist die neue Iteration des Codes:
private readonly Lazy<MobileServiceClient> lazyMobileClient =
new Lazy<MobileServiceClient>(() => new MobileServiceClient(Constants.ApplicationURL), true); // true for thread safety
public MobileServiceClient MobileClient { get { return lazyMobileClient.Value; } }
private readonly Lazy< MobileServiceSQLiteStore> offlineDB =
new Lazy<MobileServiceSQLiteStore>(() => new MobileServiceSQLiteStore(Constants.OfflineDBName), true); // true for thread safety
private MobileServiceSQLiteStore OfflineStore { get { return offlineDB.Value; } }
private static readonly Lazy<MoonDataManager> lazy = new Lazy<MoonDataManager>(() => new MoonDataManager(), true); // true for thread safety
public static MoonDataManager Instance { get { return lazy.Value; } }
private MoonDataManager()
{
MoonDataManager.Instance.RegisterTable<Models.IssuerKey>();
// Initialize file sync
// todo: investigate FileSyncTriggerFactory overload.
//Was present on Mar 30, 2016 Channel9 https://channel9.msdn.com/events/Build/2016/P408
MoonDataManager.Instance.MobileClient.InitializeFileSyncContext
(new IssuerKeyFileSyncHandler(Instance), Instance.OfflineStore);
// NOTE THE ASYNC METHOD HERE (won't compile)
await MoonDataManager.Instance.MobileClient
.SyncContext.InitializeAsync(MoonDataManager.Instance.OfflineStore,
StoreTrackingOptions.NotifyLocalAndServerOperations);
}
FYI Es ist nicht threadsicher wie Sie es haben. Lesen Sie [dies] (http://csharpindepth.com/Articles/General/Singleton.aspx) – CodingYoshi
FYI - Ich experimentiere auch mit diesem Ansatz: https://forums.xamarin.com/discussion/25881/using-async -in-xamarin-forms (Kommentar von rene_ruupert) – LamonteCristo