Должен ли я идти в тесном соединении, с синглтоном или слабо связанным, без синглтона? Azure Services, Xamarin Forms
Я делаю Xamarin Forms Cross платформенное приложение. Я пытался понять, как лучше всего интегрировать мое приложение с бэкэндом Azure. Я столкнулся с проблемой. Это было пробурено в моей голове, чтобы попытаться построить программы как можно слабосвязанными. Но затем мне сказали создать свой класс служб Azure как одноэлементный, чтобы остановить несколько созданий и испортить внутреннее соединение.
Так как я не могу использовать интерфейсы с одиночкой, чтобы мое приложение было слабо связанным. Я должен выбрать. Я думаю, что я должен пойти с интерфейсами, для слабой связи. Но я не знаю много о бэкэнд-разработке. Не удастся ли создать несколько экземпляров моего класса базы данных Azure Services?
Спасибо за любую помощь.
Вот пример формата моих Azure Services
namespace CoffeeCups
{
public class AzureService
{
public MobileServiceClient Client { get; set; } = null;
IMobileServiceSyncTable<CupOfCoffee> coffeeTable;
public static bool UseAuth { get; set; } = false;
public async Task Initialize()
{
if (Client?.SyncContext?.IsInitialized ?? false)
return;
var appUrl = "https://chattestjbapp.azurewebsites.net";
//Create our client
Client = new MobileServiceClient(appUrl);
//InitialzeDatabase for path
var path = "syncstore.db";
path = Path.Combine(MobileServiceClient.DefaultDatabasePath, path);
//setup our local sqlite store and intialize our table
var store = new MobileServiceSQLiteStore(path);
//Define table
store.DefineTable<CupOfCoffee>();
//Initialize SyncContext
await Client.SyncContext.InitializeAsync(store);
//Get our sync table that will call out to azure
coffeeTable = Client.GetSyncTable<CupOfCoffee>();
}
public async Task SyncCoffee()
{
try
{
if (!CrossConnectivity.Current.IsConnected)
return;
await coffeeTable.PullAsync("allCoffee", coffeeTable.CreateQuery());
await Client.SyncContext.PushAsync();
}
catch (Exception ex)
{
Debug.WriteLine("Unable to sync coffees, that is alright as we have offline capabilities: " + ex);
}
}
public async Task<IEnumerable<CupOfCoffee>> GetCoffees()
{
//Initialize & Sync
await Initialize();
await SyncCoffee();
return await coffeeTable.OrderBy(c => c.DateUtc).ToEnumerableAsync(); ;
}
public async Task<CupOfCoffee> AddCoffee(bool atHome, string location)
{
await Initialize();
var coffee = new CupOfCoffee
{
DateUtc = DateTime.UtcNow,
MadeAtHome = atHome,
OS = Device.RuntimePlatform,
Location = location ?? string.Empty
};
await coffeeTable.InsertAsync(coffee);
await SyncCoffee();
//return coffee
return coffee;
}
public async Task<bool> LoginAsync()
{
await Initialize();
var provider = MobileServiceAuthenticationProvider.Twitter;
var uriScheme = "coffeecups";
var user = await Client.LoginAsync(Forms.Context, provider, uriScheme);
if (user == null)
{
Settings.AuthToken = string.Empty;
Settings.UserId = string.Empty;
Device.BeginInvokeOnMainThread(async () =>
{
await App.Current.MainPage.DisplayAlert("Login Error", "Unable to login, please try again", "OK");
});
return false;
}
else
{
Settings.AuthToken = user.MobileServiceAuthenticationToken;
Settings.UserId = user.UserId;
}
return true;
}
}
}