zoukankan      html  css  js  c++  java
  • .NET 工程 基础知识-- Repository工程使用

    在 Repostiory工程建立中,我们建立了基本的工程结构,接下来就是完成CRUD的简单操作。

    这里使用Account为例:

    第一步,在Entities 里创建一个名为“Models” 或者 “Entities” 的文件夹,然后在这个文件中创建一个名为Account 的类,字段与数据库表对应。

    第二步,在Abstract里建立名为 IAccountRepository 的接口, 代码如下:

      public interface IAccountRepository
        {
            void CreateAccount(Account entity);
            IEnumerable<Account> ReadAllAccounts();
            Account ReadAccountById(int accountId);
            void UpdateAccount(Account entity);
            void DeleteAccount(Account entity);
        }

    第三步,在Repository里实现这个接口,同时需要继承抽象类 “Repositorybase<T>” 代码如下:

    public class AccountRepository : RepositoryBase<Account>, IAccountRepository
        {
            public AccountRepository(RepositoryContext repositoryContext)
                : base(repositoryContext)
            {
    
            }
    
            public void CreateAccount(Account entity)
            {
                Created(entity);
            }
    
            public IEnumerable<Account> ReadAllAccounts()
            {
                return ReadAll().OrderBy(account => account.ID).ToList();
            }
    
            public Account ReadAccountById(int accountId)
            {
                return ReadByFilter(account => account.ID == accountId)
                    .FirstOrDefault();
            }       
    
            public void UpdateAccount(Account entity)
            {
                Update(entity);
            }
    
            public void DeleteAccount(Account entity)
            {
                Delete(entity);
            }
        }

    第四步,在Abstract里边建立 名为 “IRepositoryWrapper” 的接口,代码如下:

     public interface IRepositoryWrapper
        {
            IAccountRepository Account { get; }
            void Save();
        }

    然后在 Repository中实现这个接口,代码如下:

    public class RepositoryWrapper : IRepositoryWrapper
        {
            private RepositoryContext _repositoryContext;
            private IAccountRepository _account;
    
            public IAccountRepository Account
            {
                get
                {
                    if (_account == null)
                    {
                        _account = new AccountRepository(_repositoryContext);
                    }
                    return _account;
                }
            }        
    
            public RepositoryWrapper(RepositoryContext repositoryContext)
            {
                _repositoryContext = repositoryContext;
            }
    
            public void Save()
            {
                _repositoryContext.SaveChanges();
            }
        }

    创建这个接口的原因,是在Controller的调用中,不需要定义过多的接口,只需要在定义这个接口,然后就可以找到对应每一个表的CRUD操作。

    第五步,在Webapplication工程中,新建一个Controller,API controller 名为 AccountController. 可以选择API empty controller 也可以选择带action的,这里建立API Empty controller. 因为是空的controller,所以需要创建CRUD的每一个action。

    在创建Action之前,在构造函数中传入参数:IRepositoryWrapper 接口, 然后再类主题中定义私有变量 ” private readonly IRepositoryWrapper _repositoryWrapper;“  代码如下:

     public class AccountController : ControllerBase
        {
            private readonly IRepositoryWrapper _repositoryWrapper;
    
            public AccountController(IRepositoryWrapper repositoryWrapper)
            {
                _repositoryWrapper = repositoryWrapper;
            }
            
            .....
            /* actions 部分 */

    最后,可以开始创建CRUD的Action,这里做一个CreateAccount 的例子,代码如下:

     [HttpPost]
            public IActionResult CreatedAccount([FromBody] AccountForCreationDTO accountForCreationDTO)
            {
                try
                {
                    if (accountForCreationDTO == null)
                    {
                        _loggerManager.LogInfo("Account object sent from client is null.");
                        return BadRequest("Account object is null");
                    }
    
                    if (!ModelState.IsValid)
                    {
                        _loggerManager.LogInfo("Invalid object send from client");
                        return BadRequest("Invalid model object");
                    }
    
                    var accountEntity = _mapper.Map<Account>(accountForCreationDTO);
    
                    _repositoryWrapper.Account.CreateAccount(accountEntity);
                    _repositoryWrapper.Save();
    
                    var createdAccount = _mapper.Map<AccountDTO>(accountEntity);
    
                    return CreatedAtRoute("AccountById", new { accountid = createdAccount.ID }, createdAccount);
                }
                catch (Exception exMsg)
                {
                    _loggerManager.LogError($"Something went wrong inside CreatedAccount action:{exMsg.Message}");
                    return StatusCode(500, "Interanl server error.");
                }
            }

    这段代码中 我是用了autoMap 来实现Data Transfer Object。需要注意的是,在写每个Action的时候 需要在Action的最上边写明是什么操作。例如[HttpPost],[HttpGet].[HttpPut],[HttpDelete],同时可以在每个请求后加入参数例如 getAccountById(int accountId) 这个Action前就可以加入[HttpGet("{accountId}")].

  • 相关阅读:
    js封装日期格式化函数
    原生js时间戳获取和转换
    自适应好用的一个css
    ES6五种遍历对象属性的方式
    ES6对象属性名简洁表示法和表达式、对象新方法、属性的遍历
    ES6数组扩展运算符(Rest+Spread)、类方法、原型方法
    正则表达式常见匹配
    typescript深copy和浅copy
    判断一个变量类型是对象还是数组
    npm 淘宝镜像的配置
  • 原文地址:https://www.cnblogs.com/Weimin496/p/12382266.html
Copyright © 2011-2022 走看看