Skip to content

📦 Extensions for HttpClient and Custom Repository based on dapper

Notifications You must be signed in to change notification settings

TBertuzzi/RepositoryHelpers

Repository files navigation

RepositoryHelpers

Extensions for HttpClient and Custom Repository based on dapper

This is the component, works on .NET Core and.NET Framework

Info

Code Quality Build Nuget Contributors
Codacy Badge Publish package on NuGet NuGet GitHub contributors

Build History

Build history

Platform Support

RepositoryHelpers is a .NET Standard 2.0 library.

Database/Dapper Extensions

Use the connection class to define the type of database and connection string

 var connection = new Connection()
 {
     Database = RepositoryHelpers.Utils.DataBaseType.SqlServer, //RepositoryHelpers.Utils.DataBaseType.Oracle
     ConnectionString = "Your string"
 };

Create a CustomRepository of the type of object you want to return

  var Repository = new CustomRepository<User>(conecction);

Mapping with Attributes:

[DapperIgnore] // Property will be ignored in select, insert and update
public string InternalControl { get; set; }
[PrimaryKey] // Primary key
public int MyCustomId { get; set; }
[PrimaryKey]
[Identity] //Indicates that the primary key has some identity, sequence or auto increment
public int MyBdIdIndentity { get; set; }

//You can optionally map the name of the Database table that refers to the entity
[Table("Product")] 
public class Products
{
    public int Id { get; set; }
}

Mapping with FluentMapper:

Install and use the Dapper.FluentMap.Dommel package to map your entities by creating the specific classes inherited from DommelEntityMap:

public class ProductMap : DommelEntityMap<Product>
{
    public ProductMap()
    {
        Map(p => p.Id).IsKey().IsIdentity();
        Map(p => p.Category).Ignore();
    }
}

You can define the name of the table that will be mapped

public class ProductMap : DommelEntityMap<Product>
{
    public ProductMap()
    {
        ToTable("Product");
        Map(p => p.Id).IsKey().IsIdentity();
        Map(p => p.Category).Ignore();
    }
}

After that, you must configure Dapper.FluentMap.Dommel in RepositoryHelpers:

Mapper.Initialize(c =>
{
    c.AddMap(new ProductMap());
});

Get Data:

To get results just use the Get method. can be syncronous or asynchronous

//Get All Users
var usersAsync = await Repository.GetAsync();
var users = Repository.Get();

//Get User by Id
var userAsync = await Repository.GetByIdAsync(1);
var user = Repository.GetById(1);

//Get by CustomQuery with parameters
var customQuery = "Select name from user where login = @userLogin";
var parameters = new Dictionary<string, object> { { "userLogin", "bertuzzi" } };
var resultASync = await Repository.GetAsync(customQuery, parameters);
var result = Repository.Get(customQuery, parameters);

//Get by CustomQuery without parameters
var customQuery = "Select * from user";
var resultASync = await Repository.GetAsync(customQuery);
var result = Repository.Get(customQuery);

//Get by multi-mapping custom query with 2 input types
var customQuery = "Select * from user inner join category on user.categoryId = category.Id where login = @userLogin";
var user = Repository.Get<User, Category, User>(
    customQuery,
    map: (user, category) => 
    {
        user.Category = category;
        return user;
    });

//Get by multi-mapping custom query with 2 input types (When the field that we should split and read the second object is different from "Id")
var customQuery = "Select * from user inner join state on user.stateCode = state.Code where login = @userLogin";
var user = Repository.Get<User, State, User>(
    customQuery,
    map: (user, state) => 
    {
        user.State = state;
        return user;
    },
    parameters,
    splitOn: "Code"
);

//Get by multi-mapping custom query with an arbitrary number of input types
var customQuery = "Select * from user inner join category on user.categoryId = category.Id where login = @userLogin";
var user = Repository.Get(
    customQuery,
    new[] { typeof(User), typeof(Category) },
    map: (types) => 
    {
        var user = (types[0] as User);
        user.Category = (types[1] as Category);
        return user;
    });

Insert Data :

user identity parameter to return the id if your insert needs

Repository.Insert(NewUser, true);

Update data

Repository.Update(updateUser);
Repository.UpdateAsync(updateUser);

Delete data

Repository.Delete(1);
Repository.DeleteAsync(1);

You can use ADO if you need

//Return DataSet
var customQuery = "Select name from user where login = @userLogin";
var parameters = new Dictionary<string, object> { { "userLogin", "bertuzzi" } };
Repository.GetDataSet(customQuery, parameters);

//ExecuteQuery
Repository.ExecuteQueryAsync();
Repository.ExecuteQuery();

//ExecuteScalar
Repository.ExecuteScalarAsync();
Repository.ExecuteScalar();

//ExecuteProcedure
Repository.ExecuteProcedureAsync();
Repository.ExecuteProcedure();

CustomTransaction is possible to use transaction

CustomTransaction customTransaction = new CustomTransaction(YourConnection);

customTransaction.BeginTransaction();
customTransaction.CommitTransaction();
customTransaction.RollbackTransaction();

//Sample
Repository.ExecuteQuery("yourquery", parameters, customTransaction);

DapperIgnore : if you want some property of your object to be ignored by Dapper, when inserting or updating, just use the attribute. PrimaryKey : Define your primary key. It is used for queries, updates, and deletes. IdentityIgnore: Determines that the field has identity, autoincrement ... Warns the repository to ignore it that the database will manage the field

*TIP Create a ConnectionHelper for BaseRepository and BaseTransaction to declare the connection only once :

 public sealed class ConnectionHelper
    {
        static ConnectionHelper _instance;
        public static ConnectionHelper Instance
        {
            get { return _instance ?? (_instance = new ConnectionHelper()); }
        }
        private ConnectionHelper() 
        {
            Connection = new Connection()
            {
                Database = RepositoryHelpers.Utils.DataBaseType.SqlServer,
                ConnectionString = "YourString"
            };
        }
        public Connection Connection { get; }
    }
    
 public class BaseRepository<T>
    {
        protected readonly CustomRepository<T> Repository;

        protected BaseRepository()
        {
            Repository = new CustomRepository<T>(ConnectionHelper.Instance.Connection);
        }
    }
    
     public class BaseTransaction : CustomTransaction
    {
        public BaseTransaction() :
             base(ConnectionHelper.Instance.Connection)
        {
           
        }
    }
    

LiteDB Extensions

coming soon ..

HttpClient Extensions

Extensions to make using HttpClient easy.

To enable and use Follow the doc : https://github.com/TBertuzzi/HttpExtension

Samples coming soon ..

Special Thanks to project contributors

Special Thanks users who reported bugs and helped improve the package :

  • Thiago Vieira
  • Luis Paulo Souza
  • Alexandre Harich

The RepositoryHelpers was developed by Thiago Bertuzzi under the MIT license.