第一步:创建ASP.NET Core 6项目
首先,创建一个新的ASP.NET Core 6 Web API项目:
dotnet new webapi -n RedisDemo
cd RedisDemo
第二步:安装必要的NuGet包
接下来,安装StackExchange.Redis和Microsoft.Extensions.Caching.StackExchangeRedis包:
dotnet add package StackExchange.Redis
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
第三步:配置Redis
在appsettings.json
文件中添加Redis的连接字符串:
{"ConnectionStrings": {"Redis": "localhost:6379"}
}
第四步:设置依赖注入
在Program.cs
文件中配置Redis缓存:
var builder = WebApplication.CreateBuilder(args);// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();// Configure Redis
builder.Services.AddStackExchangeRedisCache(options =>
{options.Configuration = builder.Configuration.GetConnectionString("Redis");
});var app = builder.Build();// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI();
}app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();
第五步:创建泛型仓储接口和实现
创建一个新的文件夹Repositories
,并在其中创建以下接口和类:
IRepository.cs
using System.Collections.Generic;
using System.Threading.Tasks;namespace RedisDemo.Repositories
{public interface IRepository<T>{Task<T> GetAsync(string id);Task<IEnumerable<T>> GetAllAsync();Task AddAsync(T entity);Task UpdateAsync(string id, T entity);Task DeleteAsync(string id);}
}
RedisRepository.cs
using Microsoft.Extensions.Caching.Distributed;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace RedisDemo.Repositories
{public class RedisRepository<T> : IRepository<T>{private readonly IDistributedCache _cache;private readonly string _entityName;public RedisRepository(IDistributedCache cache){_cache = cache;_entityName = typeof(T).Name.ToLower();}public async Task<T> GetAsync(string id){var data = await _cache.GetStringAsync($"{_entityName}:{id}");return data == null ? default : JsonConvert.DeserializeObject<T>(data);}public async Task<IEnumerable<T>> GetAllAsync(){// This is a simplified example. In a real-world scenario, you would need a more sophisticated way to manage keys.var keys = Enumerable.Range(1, 100).Select(i => $"{_entityName}:{i}").ToList();var result = new List<T>();foreach (var key in keys){var data = await _cache.GetStringAsync(key);if (data != null){result.Add(JsonConvert.DeserializeObject<T>(data));}}return result;}public async Task AddAsync(T entity){var id = Guid.NewGuid().ToString();var data = JsonConvert.SerializeObject(entity);await _cache.SetStringAsync($"{_entityName}:{id}", data);}public async Task UpdateAsync(string id, T entity){var data = JsonConvert.SerializeObject(entity);await _cache.SetStringAsync($"{_entityName}:{id}", data);}public async Task DeleteAsync(string id){await _cache.RemoveAsync($"{_entityName}:{id}");}}
}
第六步:创建实体类和控制器
创建一个新的文件夹Models
,并在其中创建一个实体类:
Product.cs
namespace RedisDemo.Models
{public class Product{public string Id { get; set; }public string Name { get; set; }public decimal Price { get; set; }}
}
然后创建一个控制器来使用这个仓储:
ProductsController.cs
using Microsoft.AspNetCore.Mvc;
using RedisDemo.Models;
using RedisDemo.Repositories;
using System.Collections.Generic;
using System.Threading.Tasks;namespace RedisDemo.Controllers
{[Route("api/[controller]")][ApiController]public class ProductsController : ControllerBase{private readonly IRepository<Product> _repository;public ProductsController(IRepository<Product> repository){_repository = repository;}[HttpGet("{id}")]public async Task<ActionResult<Product>> GetProduct(string id){var product = await _repository.GetAsync(id);if (product == null){return NotFound();}return product;}[HttpGet]public async Task<ActionResult<IEnumerable<Product>>> GetProducts(){var products = await _repository.GetAllAsync();return Ok(products);}[HttpPost]public async Task<ActionResult> CreateProduct(Product product){await _repository.AddAsync(product);return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);}[HttpPut("{id}")]public async Task<ActionResult> UpdateProduct(string id, Product product){await _repository.UpdateAsync(id, product);return NoContent();}[HttpDelete("{id}")]public async Task<ActionResult> DeleteProduct(string id){await _repository.DeleteAsync(id);return NoContent();}}
}
第七步:注册仓储服务
在Program.cs
文件中注册仓储服务:
builder.Services.AddScoped(typeof(IRepository<>), typeof(RedisRepository<>));
最后一步:运行项目
现在,你可以运行项目并测试API端点了:
dotnet run
你可以使用Postman或其他工具来测试API端点,例如:
GET /api/products
GET /api/products/{id}
POST /api/products
PUT /api/products/{id}
DELETE /api/products/{id}
总结
这样就完成了在ASP.NET Core 6项目中整合使用Redis,并实现泛型接口和仓储模式的完整实例。