如何像UserManager一样在async方法中更新变量属性(不用Tuple和ref)
实现类似AspNetCore Identity UserManager.CreateAsync的功能原理及示例
核心原理:引用类型的参数传递
ApplicationUser是引用类型,当你把它作为参数传入方法时,传递的是对象实例的引用(而非对象的完整副本)。这意味着:
- 方法内部可以直接修改该引用指向的对象的属性值
- 外部的原始变量(比如示例中的
user)因为指向同一个对象实例,会自动同步看到这些属性更新
不需要用ref关键字的原因:ref是用来让方法重新赋值外部变量的指向(比如让变量指向一个全新的对象),而这里只需要修改现有对象的属性,引用类型的默认参数传递方式就足够实现需求。
自定义方法示例
下面是一个简化的自定义实现,模拟保存数据并更新对象属性的逻辑:
// 自定义用户类(引用类型) public class CustomUser { public string Username { get; set; } public string Email { get; set; } // 保存后会被自动更新的属性 public Guid Id { get; set; } public DateTime CreatedAt { get; set; } } // 自定义用户管理器 public class CustomUserManager { private readonly MockDataStore _dataStore; public CustomUserManager(MockDataStore dataStore) { _dataStore = dataStore; } public async Task<IdentityResult> CreateAsync(CustomUser user, string password) { // 1. 简化的输入验证 if (string.IsNullOrEmpty(user.Username) || string.IsNullOrEmpty(password)) { return IdentityResult.Failed(new IdentityError { Description = "用户名或密码不能为空" }); } // 2. 生成并更新用户的额外属性 user.Id = Guid.NewGuid(); user.CreatedAt = DateTime.UtcNow; // 3. 模拟异步保存到数据存储 await _dataStore.SaveUserAsync(user); // 4. 返回操作结果 return IdentityResult.Success; } } // 模拟数据存储层 public class MockDataStore { public async Task SaveUserAsync(CustomUser user) { // 模拟数据库写入延迟 await Task.Delay(100); } }
使用示例
var dataStore = new MockDataStore(); var userManager = new CustomUserManager(dataStore); var user = new CustomUser { Username = "Someone", Email = "some@one.com" }; var result = await userManager.CreateAsync(user, "P@ssw0rd"); // 此时user的Id和CreatedAt已被自动更新 Console.WriteLine($"用户ID: {user.Id}"); Console.WriteLine($"创建时间: {user.CreatedAt}");
内容的提问来源于stack exchange,提问作者RoLYroLLs
相关产品推荐
相关产品推荐

