如何在Blazored.LocalStorage中使用泛型改造购物车存储逻辑?
实现泛型购物车(基于Blazored.LocalStorage)
1. 改造为泛型购物服务类
将原有的购物车服务改为泛型类,使其支持任意类型的购物项:
public class CartService<T> where T : class { private readonly ILocalStorageService _localStorage; public event Action OnChange; public CartService(ILocalStorageService localStorage) { _localStorage = localStorage; } public async Task AddToCart(T cartItem) { var cart = await _localStorage.GetItemAsync<List<T>>("cart"); if (cart == null) cart = new List<T>(); cart.Add(cartItem); await _localStorage.SetItemAsync("cart", cart); OnChange?.Invoke(); } // 可按需扩展其他泛型方法,比如获取购物车、移除商品等 public async Task<List<T>> GetCartItems() { return await _localStorage.GetItemAsync<List<T>>("cart") ?? new List<T>(); } }
2. 注册泛型服务
在Program.cs中完成泛型服务的注册:
builder.Services.AddBlazoredLocalStorage(); builder.Services.AddScoped(typeof(CartService<>));
3. 在组件中使用泛型服务
在Blazor组件中注入对应类型的购物服务,比如针对CartItem类型的使用示例:
@inject CartService<CartItem> CartService <button @onclick="() => CartService.AddToCart(new CartItem { Id = 1, Name = "示例商品" })"> 添加到购物车 </button>
额外提示
- 泛型约束
where T : class确保T为引用类型,适配LocalStorage的序列化要求 - 如果需要区分不同类型的购物车,可以修改LocalStorage的存储key,比如用
$"cart-{typeof(T).Name}"避免不同类型购物项的数据冲突
内容的提问来源于stack exchange,提问作者キムヨンイン
相关产品推荐
相关产品推荐

