GithubHelp home page GithubHelp logo

tbertuzzi / repositoryhelpers Goto Github PK

View Code? Open in Web Editor NEW
27.0 5.0 6.0 190 KB

:package: Extensions for HttpClient and Custom Repository based on dapper

C# 100.00%
dapper dapper-extensions httpclient database insert identity asynchronous asynctask executequery primarykey

repositoryhelpers's Introduction

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.

repositoryhelpers's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

repositoryhelpers's Issues

Errors using tables with reserved SQL keywords

Errors occur when attempting to execute commands with tables whose names are the same as SQL reserved words.

Example: SELECT * FROM Order

To fix this bug, I will make a pull request soon, using square brackets when referencing the table name.

Add methods to execute custom query with splitOn option

When we are working with a query that will be mapped to more than one data type, we often need to specify the name of the property that separates those data types in what is returned from the SELECT. Dapper already has this implementation using the "splitOn" parameter. It would be very useful to make this option available in this framework as well.

text/json as header

Make mediaType as application/json by default or as optional parameter in PostAsync, PutAsync, GetAsync and DeleteAsync.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.