FunSharp 2.0.8
dotnet add package FunSharp --version 2.0.8
NuGet\Install-Package FunSharp -Version 2.0.8
<PackageReference Include="FunSharp" Version="2.0.8" />
paket add FunSharp --version 2.0.8
#r "nuget: FunSharp, 2.0.8"
// Install FunSharp as a Cake Addin #addin nuget:?package=FunSharp&version=2.0.8 // Install FunSharp as a Cake Tool #tool nuget:?package=FunSharp&version=2.0.8
FunSharp
FunSharp oferece uma abordagem funcional para o tratamento de erros e valores nulos em .Net, através de RailWay Oriented Programming.
Primeiro, vamos ver como fazemos sem o FunSharp, e como ele pode nos ajudar.
Segue abaixo o exemplo de um método muito comum em qualquer projeto, a obtenção de dados de um repositório:
public class PessoaService
{
// Demais implementações da classe ...
public Pessoa ObterPessoa(int id)
{
try
{
return repository.ObterPessoa(id);
}
catch(Exception ex)
{
return null;
}
}
}
Consumindo o método acima, não há como saber se o resultado é o esperado ou não, ou se houve algum erro. Se o desenvolvedor não verificar o valor retornado, podem ocorrer erros como NullReferenceException
.
var pessoa = pessoaService.ObterPessoa(id);
No caso acima, podem ocorrer 2 situações:
- O objeto Pessoa é retornado com os dados da pessoa;
- O objeto Pessoa é retornado com o valor NULL.
E caso o valor seja NULL, pode ter sido por não existir no banco de dados OU por ter ocorrido uma Exception
.
FunSharp oferece uma interface fluída para que possamos tratar estas questões de uma forma muito simples, usando o pattern Monad. Reescrevendo o método acima, basta você envolver o tipo de retorno em um tipo Result<T>
, no caso, Result<Pessoa>
, ou seja, o resultado da obtenção do objeto Pessoa
:
public Result<Pessoa> ObterPessoa(int id)
{
try
{
return repository.ObterPessoa(id);
}
catch(Exception ex)
{
return new Error(ex, "Erro ao obter os dados da pessoa.");
}
}
Se ocorrer uma Exception, basta retornar um objeto Error
, ele será convertido para o tipo Result<Pessoa>
.
Ao consumir o método acima, você pode ter uma lógica para cada situação através de pattern matching:
- Retorno de valor (some);
- Não retorno de valor (none);
- Erro (error);
O código abaixo mostra como consumir o método em um Action de um Controller Asp.Net Core Web API:
public IActionResult Get(int id)
{
return pessoaService.ObterPessoa(id)
.Match<IActionResult>(
some: pessoa => Ok(pessoa),
none: () => NotFound(),
error: err => BadRequest(err.Message)
);
}
Veja que o método Match
retornou o objeto IActionResult
mais adequado para cada situação, sem o uso de if .. else
, sem o uso de switch
, de forma bastante simplificada e elegante.
Instalação
Visual Studio
No Package Manager Console (Visual Studio) digite Install-Package FunSharp
e tecle Enter.
Ou clique com o botão direito do mouse sobre o projeto onde será instalado o FunSharp (ou sobre a Solution), depois clique na opção Manage NuGet Packages.... Na aba Browse, digite FunSharp no campo de pesquisa e tecle Enter. Na listagem, clique sobre o FunSharp e no painel lateral direito clique no botão Install.
CLI
Dentro da pasta do projeto onde o FunSharp será instalado, digite dotnet add package FunSharp
.
FunSharp oferece muito mais recursos, como o tipo MayBe (MayBe<T>), extensões para Nullable e Task, dentre outros. Consulte a wiki.
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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. 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.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.