Extensions for HttpClient and Custom Repository based on dapper
Info
| Code Quality | Build | Nuget | Contributors |
|---|---|---|---|
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.