.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}")].

 

posted @ 2020-02-29 12:19  僧正  阅读(497)  评论(0编辑  收藏  举报