Pular para o conteúdo principal

Criando repositório MongoDB com C#

Olá

Recentemente comecei a trabalhar com mongo em projetos dotnet. Para quem ainda não se "aventurou" com bancos não relacionais e dotnet, posso dizer que é muito fácil e tranquilo realizar as implementações e de quebra ganhar em performance de consulta.

Para poder trabalhar com mongo em dotnet você precisa incluir o driver do mongo. Existe um drive oficial que pode ser baixado via nuget. Nos exemplos a seguir foi utilizado a versão 2.4.4 do drive, mas enquanto escreve este post já esta disponível a versão 2.5.0 com melhorias, porém mais dependências.



Para criar o template repositório com métodos para inserir, alterar, remover e consultar pode ser utilizado uma classe como a seguir:

using MongoDB.Bson;
using MongoDB.Driver;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Threading.Tasks;
namespace DotNet.Mongo.Repository.Repositorios
{
public class BaseRepositorio<TColecao>
{
protected static IMongoClient Client => new MongoClient(ConfigurationManager.ConnectionStrings["conexao"].ConnectionString);
protected static IMongoDatabase Db => Client.GetDatabase(ConfigurationManager.AppSettings["database"]);
protected static IMongoCollection<TColecao> Colecao;
public BaseRepositorio(string colecao)
{
Colecao = Db.GetCollection<TColecao>(colecao);
}
/// <summary>
/// Obter por Id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual TColecao Obter(string id)
{
return Colecao.Find(FiltroPorId(id)).FirstOrDefault();
}
public virtual IQueryable<TColecao> Obter()
{
return Colecao.AsQueryable();
}
/// <summary>
/// Inserir varios registros
/// </summary>
/// <param name="modelo"></param>
public virtual void Inserir(IList<TColecao> modelo)
{
Colecao.InsertMany(modelo);
}
/// <summary>
/// Inserir um registro
/// </summary>
/// <param name="modelo"></param>
public virtual void Inserir(TColecao modelo)
{
Colecao.InsertOne(modelo);
}
public virtual async Task InserirAsync(IList<TColecao> modelo)
{
await Colecao.InsertManyAsync(modelo);
}
public virtual async Task InserirAsync(TColecao modelo)
{
await Colecao.InsertOneAsync(modelo);
}
public virtual void Atualizar(TColecao modelo)
{
Colecao.ReplaceOne(FiltroPorId(BsonTypeMapper.MapToDotNetValue(modelo.ToBsonDocument().GetElement("_id").Value).ToString()), modelo);
}
public virtual void Remover(string id)
{
Colecao.DeleteOne(FiltroPorId(id));
}
protected FilterDefinition<TColecao> FiltroPorId(string id)
{
return Builders<TColecao>.Filter.Eq("_id", new ObjectId(id));
}
}
}
Para implementar em outras classes para utilizar os métodos desta classe como herança é necessário passar a entidade de modelo como tipagem e no construtor a coleção utilizada na consulta:

using DotNet.Mongo.Repository.Entidades;
namespace DotNet.Mongo.Repository.Repositorios
{
public class ContatoRepositorio : BaseRepositorio<Contato>
{
public ContatoRepositorio() : base("contato")
{
}
}
}
Para utilizar algum método como o inserir, você pode chamar da seguinte maneira:
var contatoRepositorio = new ContatoRepositorio();
var contato = new Contato()
{
Nome = "Teste",
Telefone = new Collection<Telefone>()
{
new Telefone{ Ddd=47,Numero=989085525, Tipo=Enumeradores.TipoTelefone.Celular}
}
};
contatoRepositorio.Inserir(contato);
Na camada de startup de aplicação você pode adicionar parâmetros de conexão (connectionStrings) com a base de dados mongo para ser obtida através do código ConfigurationManager.ConnectionStrings["conexao"].ConnectionString e a string de configuração indicando a base de dados que é obtida pelo código ConfigurationManager.AppSettings["database"]. Esta é uma das maneiras de informar para aplicação qual local armazenar e colher os dados. Existem outras... sinta-se livre para implementar como quiser.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="conexao" connectionString="mongodb://localhost:27017" />
</connectionStrings>
<appSettings>
<add key="database" value="agenda" />
</appSettings>
</configuration>
view raw App.config hosted with ❤ by GitHub

O fonte pode ser encontrado em:
Diretório:

Comentários

Postar um comentário

Postagens mais visitadas deste blog

Dica: Extensão Indentar código VUE Visual Studio Code

Olá Por muitas é necessário um atalho para formatar o seu código fonte no editor de texto. Para formatação de HTML, CSS, JS e afins no visual studio code você pode utilizar o: HTML Snippets Mas esta extensão acima não formata arquivos de template .vue . Para formatar este tipo de arquivos é necessário instalar alguma outra extensão. Entre as que busquei a que faz o serviço da melhor forma atualmente utilizando o atalho alt+shift+f   é o plugin ventur: Vetur Este plugin é muito bom mesmo. Facilitou bastante a formatação de fontes em templates .vue. É isso espero que ajude;)

Como criar componente dropdown com checkbox ASP.NET MVC

Neste post irei demonstrar a criação de um componente  dropdown com checkbox para selecionar as opções desejadas. Para começar podemos criar uma classe estática para criar o componente que será utilizado numa página razor. public static class Extensions { public static MvcHtmlString DropdownCheckbox( this HtmlHelper helper, string placeholder, IEnumerable<SelectListItem> selectList, object htmlAttributes) { string items = "" ; string rodape = "" ; if (htmlAttributes == null ) { htmlAttributes = new { }; } var attributes = new ExpandoObject() as IDictionary< string , Object>; foreach (PropertyInfo property in htmlAttributes.GetType().GetProperties()) { attributes.Add(property.Name, property.GetValue(htmlAttributes)); } string idDropdown = "dr...

C# :Removendo propriedades nulas ao serializar JSON

Olá Para serializar uma classe em formato JSON em c#,por muitas vezes é utilizado o pacote Newtonsoft . Em alguns momentos há a necessidade de serializar somente as propriedades que estiverem preenchidas no objeto, removendo assim as que estiverem nulas. Para isto você pode utilizar a propriedade  NullValueHandling da classe  JsonSerializerSettings . Segue exemplo: Até a próxima