NotifiqueMe 4.0.0

dotnet add package NotifiqueMe --version 4.0.0
                    
NuGet\Install-Package NotifiqueMe -Version 4.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="NotifiqueMe" Version="4.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="NotifiqueMe" Version="4.0.0" />
                    
Directory.Packages.props
<PackageReference Include="NotifiqueMe" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add NotifiqueMe --version 4.0.0
                    
#r "nuget: NotifiqueMe, 4.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package NotifiqueMe@4.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=NotifiqueMe&version=4.0.0
                    
Install as a Cake Addin
#tool nuget:?package=NotifiqueMe&version=4.0.0
                    
Install as a Cake Tool

Notifique-me!

NuGet NuGet

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .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.

Version Downloads Last Updated
4.0.0 146 10/19/2025
3.1.0 175,667 1/20/2020
3.0.0 795 1/19/2020