NotifiqueMe 4.0.0
dotnet add package NotifiqueMe --version 4.0.0
NuGet\Install-Package NotifiqueMe -Version 4.0.0
<PackageReference Include="NotifiqueMe" Version="4.0.0" />
<PackageVersion Include="NotifiqueMe" Version="4.0.0" />
<PackageReference Include="NotifiqueMe" />
paket add NotifiqueMe --version 4.0.0
#r "nuget: NotifiqueMe, 4.0.0"
#:package NotifiqueMe@4.0.0
#addin nuget:?package=NotifiqueMe&version=4.0.0
#tool nuget:?package=NotifiqueMe&version=4.0.0
Notifique-me!
Projeto que permite a utilização de maneira simples do pattern "Domain Notifications".
Esse projeto é baseado no projeto Flunt (https://github.com/andrebaltieri/flunt). Porém a necessidade de traduzir para o português-BR, motivou a criação desse projeto.
O que é isso?
Você já precisou realizar algumas validações no seu código e com elas adicionou uma grande quantidade de "ifs", disparando também exceptions sem necessidade?
if (cont == 0)
throw new Exception("Contagem não pode ser zero");
if (idade < 18)
throw new Exception("Funcionalidade proibida para menores de 18 anos.");
if (!ValidaCpf("172.222.479-1a"))
throw new Exception("CPF inválido.");
Cada "if" pode trazer complexidade no entendimento do seu código. Além disso várias dessas validações podem ocorrer por mais de uma vez. Então, por que não, substituir todas essas validações e seus ifs e exceptions desnecessários, por métodos de validações reusáveis, testáveis e notificar caso algo esteja errado?
Conheci esse "pattern" pelos treinamentos do André Baltieri , no site Balta.IO (http://balta.io/) e confesso que depois disso, uso if com muito mais sabedoria e deixo as exceptions para os imprevistos do dia a dia...
Sua classe "notificável"
Para que sua classe se torne "notificável", basta herdar da classe Notificavel (namespace JNogueira.NotifiqueMe)
using JNogueira.NotifiqueMe;
namespace StarWars
{
public class Jedi : Notificavel
{
}
}
Pronto, sua classe já está preparada para utilizar notificações!
Adicionando uma notificação
Ao herdar da classe Notificavel, você poderá utilizar os métodos AdicionarNotificacao e AdicionarNotificacoes para adicionar notificações.
using JNogueira.NotifiqueMe;
namespace StarWars
{
public class Jedi : Notificavel
{
public Jedi(string nome, int anosExperiencia)
{
if (string.IsNullOrEmpty(nome))
this.AdicionarNotificacao("Informe seu nome, guerreiro!");
if (anosExperiencia >= 1 && anosExperiencia <= 5)
this.AdicionarNotificacao("Você ainda é um padawan. Finalize seu treinamento!", Dictionary<string, string> { { "Experiência", anosExperiencia.ToString() }, { "Data atual", DateTime.Today.ToShortTimeString() } });
}
}
}
É inválido?
Toda classe notificável possui a propriedade Invalido. Existindo pelo menos uma notificação, sua classe é considerada inválida!
var jedi1 = new Jedi("Anakin Skywalker", 1);
if (jed1.Invalido)
{
// Eita! Temos notificações aqui, padawan!
}
Exibindo as notificações
Você tem acesso a todas as notificações da classe através da propriedade Notificacoes.
var jedi1 = new Jedi("Anakin Skywalker", 1);
if (jed1.Invalido)
{
foreach (var notificacao in jedi1.Notificacoes)
{
Console.WriteLine($"{notificacao.Mensagem}");
}
}
Agrupando as notificações
Caso você possua mais de uma classe notificável, é possível agrupar notificações de outras classes notificáveis, através do método AdicionarNotificacoes.
class Program : Notificavel
{
void Main(string[] args)
{
var jedi1 = new Jedi("Anakin Skywalker", 1);
var jedi2 = new Jedi("Rey", 2);
AdicionarNotificacoes(jedi1, jedi2);
}
}
Reusando validações...
Por várias vezes você precisou validar, por exemplo, uma string para se certificar de que ela não fosse nula ou vazia, certo?
...
public Jedi(string nome, int anosExperiencia)
{
if (string.IsNullOrEmpty(nome))
this.AdicionarNotificacao("Informe seu nome, guerreiro!");
...
}
No exemplo acima, validamos apenas o parâmetro "nome", porém e se fosse necessário realizar várias outras validações? Você iria fazer um CTRL+C e CTRL+V por várias vezes na linha "if (string.IsNullOrEmpty(...))", certo...?
Errado! Porque não, reusar essas validações comuns:
...
public Jedi(string nome, int anosExperiencia)
{
// if (string.IsNullOrEmpty(nome))
// this.AdicionarNotificacao("Informe seu nome, guerreiro!");
this.NotificarSeNuloOuVazio(nome, "Informe seu nome, guerreiro!");
...
}
No exemplo acima, caso o parâmetro "nome" seja nulo ou vazio, uma notificação é criada! Resumindo: tchau pra mais um if!
A classe Noitificavel utiliza extension methods, trazendo vários tipos de validações comumente utilizadas. Veja alguns exemplos:
this.NotificarSePossuirTamanhoSuperiorA("abc", 2, "A string 'abc' tem tamanho superior a 2.");
this.NotificarSeEmailInvalido("email@invalido", "O e-mail é inválido.");
this.NotificarSeMaiorOuIgualA(3, 2, "O valor 3 é maior ou igual ao valor 2.");
A lista de validações está disponível em https://github.com/jlnpinheiro/notifique-me-csharp/tree/master/NotifiqueMe/Validacoes. Deixe já aquele seu pull request para contribuir!
Dependências
.NET Standard 2.0+
Informações sobre versões suportadas em https://docs.microsoft.com/pt-br/dotnet/standard/net-standard
Instalação
NuGet
Install-Package NotifiqueMe
.NET CLI
dotnet add package NotifiqueMe
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on NotifiqueMe:
| Package | Downloads |
|---|---|
|
discord-webhook-client
A client class to send messages using a Discord webhook. |
GitHub repositories
This package is not used by any popular GitHub repositories.