En résumé : .Net Core, qu'est ce que c'est

icon Tags de l'article : , ,

Novembre 27, 2018
Hello tout le monde,

Comme j'ai repris les cours il y a peu et que je me suis mis à fond dans le .Net Core (principalement ASP.Net Core et Entity Framework Core), je me suis dit qu'il serait intéressant de commencer une petite série d'articles pour en parler. Expliquer les différences, ce que ça apporte, tout ça tout ça.

Déjà, en résumé, .Net Core, c'est le nouveau runtime/framework opensource de Microsoft.
Il s'agit d'une refonte from scratch du Framework .Net, destinée à être plus ouverte et plus performante.
Le code source est disponible sur github et ce bébé framework a déjà fêté ses 59 releases grâce à ses 149 contributeur(ices)s!

Du coup, grâce à ce nouveau framework, il est possible de créer des applications .Net pour tous supports : Linux, Mac, Android, etc...

Et si vous êtes un dinosaure du .Net comme moi, je sais que vous allez vous poser quelques questions sur .Net Core. Je vais essayer d'y répondre de mon mieux.

1) Est-ce que c'est vraiment plus performant ?

Oui. En tout cas pour la partie ASP.Net Core. Pour la partie Entity Framework, je ne pourrais dire avec précision, mais je pense que comme avec Entity Framework classique, ça dépend plus de l'utilisation qu'on en fait que du framework lui-même.

2) Est-ce que c'est mieux et/ou plus complet ?

Alors mieux... tout dépend de ce que vous cherchez. C'est plus léger, plus performant, et plus compatible/ouvert.
En revanche, vu qu'il s'agit d'un nouveau framework, c'est clairement moins complet que le .Net Framework. Ca évolue vite, mais au jour le jour.
Du coup, si vous utilisez des fonctionnalités très poussées de .Net, il se peut que vous vous retrouviez bloqué.
Personnellement, ce n'est pas encore mon cas. J'ai réussi à faire en ASP.Net Core tout ce que je faisais en ASP.Net MVC classique !

3) Est-ce que c'est documenté ?

Ohhhh ça oui. Il semblerait que Microsoft ait fait un énorme travail de documentation sur tout ce qu'il était possible de faire avec .Net Core. J'ai même trouvé des ressources pour Entity Framework Core sans équivalent Entity Framework classique !

4) Est-ce qu'il y a des packages NuGet ?

Plein ! Evidemment il y en a moins que de packages pour .Net Framework classic, mais bien assez pour tout ce qu'on veut faire. La majorité des packages Nuget maintenus et/ou critiques ont une version Core aujourd'hui.

5) Est-ce qu'il y a des fonctionnalités en plus ?

Yep. Comme je disais, il s'agit d'un framework codé from scratch. Sans s'embarrasser de l'existant. Du coup les devs ont ajouté plein de choses qui manquaient.
Le premier exemple qui me vient en tête : l'injection de dépendances est gérée nativement !

6) Est-ce que tu es payé pour la rédaction de cet article ?

J'aimerais bien ! Mais ce n'est pas le cas. J'avais juste envie de vous présenter rapidement le framework, avant de commencer à publier du code sur ce sujet.

Voilà, j'espère que cet article vous a plus, et je vous dit à bientôt pour la suite !

Une classe de base pour manipuler SQLite facilement en C#

icon Tags de l'article : ,

Avril 03, 2015
Hello à tous,

Aujourd'hui je vais vous parler de SQLite. Lors d'un projet récent, j'ai eu à manipuler une BDD SQLite en C#. Pour cela j'ai créé une classe qui peut vous intéresser.

La première étape, pour manipuler du SQLite, est d'installer le package Nuget SQLite (et ses prérequis).

Ensuite, j'ai créé cette classe abstraite :

using System;
using System.Collections.Generic;
using System.Data.SQLite;

public abstract class BaseDA<T>
{
	public string ConnectionString { get; set; }

	public BaseDA(string connectionString)
	{
		this.ConnectionString = connectionString;
	}

	protected T GetUniqueItem(string sql, Func<SQLiteDataReader, T> mappingMethod)
	{
		var connection = new SQLiteConnection(this.ConnectionString);

		try
		{
			var command = new SQLiteCommand(sql, connection);

			var reader = command.ExecuteReader();

			if (reader.Read())
			{
				return mappingMethod(reader);
			}
		}
		finally
		{
			connection.Close();
		}

		return default(T);
	}

	protected IEnumerable<T> GetItems(string sql, Func<SQLiteDataReader, T> mappingMethod)
	{
		var connection = new SQLiteConnection(this.ConnectionString);

		try
		{
			var command = new SQLiteCommand(sql, connection);

			var reader = command.ExecuteReader();

			var result = new List<T>();

			while (reader.Read())
			{
				result.Add(mappingMethod(reader));
			}

			return result;
		}
		finally
		{
			connection.Close();
		}
	}

	protected int ExecuteNonQuery(string sql)
	{
		var connection = new SQLiteConnection(this.ConnectionString);

		try
		{
			var command = new SQLiteCommand(sql, connection);

			return command.ExecuteNonQuery();
		}
		finally
		{
			connection.Close();
		}
	}
}

Comme vous le voyez, cette classe contient 3 méthodes basiques me permettant de requêter facilement ma BDD SQLite.

Je n'ai plus qu'à créer une classe qui hérite de cette classe abstraite, pour, par exemple, gérer mes utilisateurs :

using ApiManager.BusinessEntities;
using System.Collections.Generic;
using System.Data.SQLite;

public class UserDA : BaseDA<UserBE>
{
	public UserDA(string connectionString) : base(connectionString)
	{
	}

	public UserBE GetUserByLogin(string login)
	{
		var sql = string.Format("SELECT * FROM User WHERE Login='{0}'", login);

		return GetUniqueItem(sql, this.MapUser);
	}

	public IEnumerable<UserBE> GetUsers()
	{
		var sql = "SELECT * FROM User";

		return (IEnumerable<UserBE>)GetItems(sql, this.MapUser);
	}

	public bool AddUser(UserBE user)
	{
		var sql = string.Format("INSERT INTO User VALUES ('{0}', '{1}', {2})", user.Login, user.Password, user.IsAdmin ? "1" : "0");

		return ExecuteNonQuery(sql) == 1;
	}

	public bool DeleteUser(int idUser)
	{
		var sql = string.Format("DELETE FROM User WHERE Id = {0}", idUser);

		return ExecuteNonQuery(sql) == 1;
	}

	private UserBE MapUser(SQLiteDataReader reader)
	{
		return new UserBE()
		{
			Id = (int)reader["Id"],
			Login = reader["Login"].ToString(),
			IsAdmin = (bool)reader["IsAdmin"],
			Password = reader["Password"].ToString()
		};
	}
}

Voilà, en résumé :
  • Ma classe mère, BaseDA, contient 3 méthodes pour requêter la BDD à partir de la connection string passée dans le constructeur.
  • Ensuite on crée une classe qui hérite de BaseDA et qui appelera le constructeur de cette dernière.
  • Enfin, on n'a plus qu'à appeler les méthodes de la classe mère avec le SQL désiré (et la méthode de mapping reader => objet dans le cas des méthodes de Get)

Voilà, on ne sait jamais, ça vous servira peut-être un jour !

Bonne journée à tous... Et bon weekend !