本点要点
与传统的 ASP.NET 相比, ASP.NET Core 的新架构提供了一些好处
ASP.NET Core 从一开始就包含对依赖注入的支持
单一职责原则简化了实施和设计.
端口和适配器模式将业务逻辑与其他依赖项分离
解耦的架构使测试更容易, 更健壮
.NET Core 最初是在 2016 年发布的, 随着. NET Core 2.0 的发布, 微软拥有了下一个通用, 模块化, 跨平台和开源的平台主版本..NET Core 已经创建了许多 API, 在当前版本的. net 框架中均可用. 它最初是为下一代 ASP.NET https://www.asp.net/ 解决方案而创建的, 但现在成了许多其他场景的驱动和基础, 包括物联网, 云计算和下一代移动解决方案. 在本系列文章中, 我们将探讨. NET Core 的一些好处, 以及它如何不仅能使传统的. NET 开发人员受益, 还能使所有需要为市场带来健壮, 高效和经济的解决方案的技术人员受益.
InfoQ 的这篇文章是这个系列文章 ".NET Core" 的一部分. 您可以通过 RSS 订阅接收通知.
- public sealed class Album
- {
- public int AlbumId { get; set; }
- public string Title { get; set; }
- public int ArtistId { get; set; }
- public ICollection<Track> Tracks { get; set; } = new HashSet<Track>();
- public Artist Artist { get; set; }
- }
- public class AlbumViewModel
- {
- public int AlbumId { get; set; }
- public string Title { get; set; }
- public int ArtistId { get; set; }
- public string ArtistName { get; set; }
- public ArtistViewModel Artist { get; set; }
- public IList<TrackViewModel> Tracks { get; set; }
- }
- public interface IAlbumRepository : IDisposable
- {
- Task<List<Album>> GetAllAsync(CancellationToken ct = default(CancellationToken));
- Task<Album> GetByIdAsync(int id, CancellationToken ct = default(CancellationToken));
- Task<List<Album>> GetByArtistIdAsync(int id, CancellationToken ct = default(CancellationToken));
- Task<Album> AddAsync(Album newAlbum, CancellationToken ct = default(CancellationToken));
- Task<bool> UpdateAsync(Album album, CancellationToken ct = default(CancellationToken));
- Task<bool> DeleteAsync(int id, CancellationToken ct = default(CancellationToken));
- }
- public async Task<AlbumViewModel> GetAlbumByIdAsync(int id, CancellationToken ct = default(CancellationToken))
- {
- var albumViewModel = AlbumCoverter.Convert(await _albumRepository.GetByIdAsync(id, ct));
- albumViewModel.Artist = await GetArtistByIdAsync(albumViewModel.ArtistId, ct);
- albumViewModel.Tracks = await GetTrackByAlbumIdAsync(albumViewModel.AlbumId, ct);
- albumViewModel.ArtistName = albumViewModel.Artist.Name;
- return albumViewModel;
- }
- public class AlbumRepository : IAlbumRepository
- {
- private readonly ChinookContext _context;
- public AlbumRepository(ChinookContext context)
- {
- _context = context;
- }
- private async Task<bool> AlbumExists(int id, CancellationToken ct = default(CancellationToken))
- {
- return await GetByIdAsync(id, ct) != null;
- }
- public void Dispose()
- {
- _context.Dispose();
- }
- public async Task<List<Album>> GetAllAsync(CancellationToken ct = default(CancellationToken))
- {
- return await _context.Album.ToListAsync(ct);
- }
- public async Task<Album> GetByIdAsync(int id, CancellationToken ct = default(CancellationToken))
- {
- return await _context.Album.FindAsync(id);
- }
- public async Task<Album> AddAsync(Album newAlbum, CancellationToken ct = default(CancellationToken))
- {
- _context.Album.Add(newAlbum);
- await _context.SaveChangesAsync(ct);
- return newAlbum;
- }
- public async Task<bool> UpdateAsync(Album album, CancellationToken ct = default(CancellationToken))
- {
- if (!await AlbumExists(album.AlbumId, ct))
- return false;
- _context.Album.Update(album);
- _context.Update(album);
- await _context.SaveChangesAsync(ct);
- return true;
- }
- public async Task<bool> DeleteAsync(int id, CancellationToken ct = default(CancellationToken))
- {
- if (!await AlbumExists(id, ct))
- return false;
- var toRemove = _context.Album.Find(id);
- _context.Album.Remove(toRemove);
- await _context.SaveChangesAsync(ct);
- return true;
- }
- public async Task<List<Album>> GetByArtistIdAsync(int id, CancellationToken ct = default(CancellationToken))
- {
- return await _context.Album.Where(a => a.ArtistId == id).ToListAsync(ct);
- }
- }
- [Route("api/[controller]")]
- public class AlbumController : Controller
- {
- private readonly IChinookSupervisor _chinookSupervisor;
- public AlbumController(IChinookSupervisor chinookSupervisor)
- {
- _chinookSupervisor = chinookSupervisor;
- }
- [HttpGet]
- [Produces(typeof(List<AlbumViewModel>))]
- public async Task<IActionResult> Get(CancellationToken ct = default(CancellationToken))
- {
- try
- {
- return new ObjectResult(await _chinookSupervisor.GetAllAlbumAsync(ct));
- }
- catch (Exception ex)
- {
- return StatusCode(500, ex);
- }
- }
- ...
- }
来源: http://www.infoq.com/cn/articles/advanced-architecture-aspnet-core