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