Представьте, что у вас есть продукт под названием «Zebra», который может быть дополнен плагинами. Он находит плагины, ища библиотеки DLL в некоторых каталогах. Он загружает все эти DLL и использует отражение для поиска любых классов, которые реализуют IZebraPlugin
, а затем вызывает методы этого интерфейса для связи с плагинами.
Это делает его полностью независимым от какого-либо конкретного класса плагина - ему все равно, что представляют собой классы. Он заботится только о том, чтобы они соответствовали спецификации интерфейса.
Интерфейсы - это способ определения точек расширяемости, подобных этому. Код, который говорит с интерфейсом, более слабо связан - на самом деле он не связан вообще с каким-либо другим конкретным кодом. Он может взаимодействовать с плагинами, написанными годами позже людьми, которые никогда не встречались с оригинальным разработчиком.
Вместо этого вы можете использовать базовый класс с виртуальными функциями - все плагины будут получены из базового класса. Но это гораздо более ограничивает, потому что класс может иметь только один базовый класс, тогда как он может реализовать любое количество интерфейсов.
С Windows 10 Fall Creators Update (сборка 16299) UWP-приложения теперь могут напрямую обращаться к SQL Server через стандартные классы NET (System.Data.SqlClient) - благодаря недавно добавленной поддержке .NET Standard 2.0 в UWP.
Вот демонстрационное приложение Northwind UWP: https://github.com/StefanWickDev/IgniteDemos
Мы представили эту демонстрацию в Microsoft Ignite в сентябре 2017 года , вот запись нашего сеанса (пропустите 23:00 для демонстрации SQL): https://myignite.microsoft.com/sessions/53541
кода для извлечения продуктов из базы данных Northwind (см. DataHelper.cs в демо). Обратите внимание, что это точно такой же код, который вы бы пишете для Winforms или WPF-приложения - благодаря .NET Standard 2.0:
public static ProductList GetProducts(string connectionString)
{
const string GetProductsQuery = "select ProductID, ProductName, QuantityPerUnit," +
" UnitPrice, UnitsInStock, Products.CategoryID " +
" from Products inner join Categories on Products.CategoryID = Categories.CategoryID " +
" where Discontinued = 0";
var products = new ProductList();
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (conn.State == System.Data.ConnectionState.Open)
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = GetProductsQuery;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var product = new Product();
product.ProductID = reader.GetInt32(0);
product.ProductName = reader.GetString(1);
product.QuantityPerUnit = reader.GetString(2);
product.UnitPrice = reader.GetDecimal(3);
product.UnitsInStock = reader.GetInt16(4);
product.CategoryId = reader.GetInt32(5);
products.Add(product);
}
}
}
}
}
return products;
}
catch (Exception eSql)
{
Debug.WriteLine("Exception: " + eSql.Message);
}
return null;
}
Если вам нужно поддерживать более ранние версии, чем обновление разработчиков Fall, существует также способ вызывать API SqlClient из вашего пакета приложений UWP через Bridge Desktop. У меня есть образец для этого опубликованного здесь: https://github.com/Microsoft/DesktopBridgeToUWP-Samples/tree/master/Samples/SQLServer
Здесь простой образец и видео . Не уверен, достаточно ли вам.
Здесь трудная точка
Мне тоже нужно пойти по этой же дороге ... С нетерпением ожидаем, что SQLServer будет напрямую доступен через EF Core.
Я просмотрел оба учебника выше и с тех пор, как я новичок в разработке , это только мокрый мой аппетит. Однако я нашел этот подробный видео-учебник на YouTube, который идет вам через
Несмотря на то, что это видео не было на английском языке, я смог посмотреть, что он делал тогда паузу и дублирование.
Примечание: из Windows 10 Fall Creators Update (16299) мы можем напрямую обращаться к базе данных SQL Server с помощью .NetStanded 2.0
Поскольку нет прямого способа подключения к SQL Server, нам необходимо создать API для нашей базы данных для подключения к SQL Server.
Это решение описывает
HttpClient httpClient = new HttpClient();
var jsonReponse = await httpClient.GetStringAsync("http://localhost:xxxxx/api/LogIns");
logInResult = JsonConvert.DeserializeObject<List<LogIn>>(jsonReponse);
Вы можете получить класс модели из моделей
Просто создайте тот же класс в проекте UWP
var logIn = new Models.LogIn()
{
Username = "username",
Password = "password"
};
var logInJson = JsonConvert.SerializeObject(logIn);
HttpClient httpClient = new HttpClient();
var httpContent = new StringContent(logInJson);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
await httpClient.PostAsync("http://localhost:56267/api/LogIns", httpContent);
Для получения дополнительной информации информация о Сериализация JSON и десериализация с использованием библиотеки JSON.NET в C #