dependency-injection - 将组件的依赖注入方法移动到 Blazor 服务器端中的分离 CS 库
问题描述
希望在单独的 .cs 文件和/或单独的库中创建可重用的函数/方法。当然我知道怎么做,我的问题是我不知道在需要使用依赖注入元素的情况下怎么做。例如,这是一个关于获取用户属性的非常简单的函数:
[Inject]
public UserManager<IdentityUser> UserManager { get; set; }
public async Task<string> GetUserId(string emailName)
{
var user = await userManager.FindByNameAsync(emailName);
if (user == null)
return null;
return user.Id;
}
如果(!)组件已初始化,这适用于每个剃须刀文件/组件。如果没有,注入的服务也没有初始化并得到一个空异常错误。
我不想将此代码片段重写/复制到我想使用的每个组件中,所以我想为它创建一个类或库。正确的方法应该是什么?最好的事情是如果我可以将这些函数移动到单独的类库或 Razor 类库中。
更新:
@Nkosi 提供了完美的解决方案,但我想向前思考一点。之前的代码示例非常小,那么如果我的自定义方法需要 2-3-4 或更多 DI 怎么办?例如(在 Razor 组件中):
[Inject]
public UserManager<IdentityUser> UserManager { get; set; }
[Inject]
public SignInManager<IdentityUser> SignInManager { get; init; }
[Inject]
public IJSRuntime jsRuntime { get; init; }
[Inject]
public CookieAuthenticationOptions cookieAuthenticationOptions { get; set; }
[Inject]
public IOptionsMonitor<CookieAuthenticationOptions> c_options { get; set; }
public async Task<string> GetUserWithOtherStuff(string email, string psw)
{
cookieAuthenticationOptions = c_options.Get("schema");
var user = await UserManager.FindByNameAsync(email);
var valid = await SignInManager.UserManager.CheckPasswordAsync(user, psw);
// etc..
return something;
}
解决方案
将其移动到单独的类/库
public interface IUserService {
Task<string> GetUserId(string emailName);
}
public class UserService : IUserService {
private readonly UserManager<IdentityUser> userManager;
public UserService(UserManager<IdentityUser> userManager) {
this.userManager = userManager;
}
public async Task<string> GetUserId(string emailName) {
var user = await userManager.FindByNameAsync(emailName);
if (user == null)
return null;
return user.Id;
}
}
并在需要的地方注入封装的服务
[Inject]
public IUserService UserService { get; set; }
确保所有必要的依赖项都在服务集合中注册。
可以制作一个扩展方法来对所需的依赖注册进行分组
public static IServiceCollection AddUserServices(this IServiceCollection services) {
services
.AddScoped<IUserService, UserService>()
.AddIdentity<.....>()
//... add what is needed for this library library to function
return services;
}
并在需要时调用/重用
//...
services.AddUserServices();
//...
推荐阅读
- spring-mvc - mongoReactiveTemplate 聚合查询
- java - 如果 Spark 数据集中的记录的键相同,如何创建值列表
- java - 如何仅将主题中的最后一条消息保存到文件中?
- java - 在编译时获取处理器内部方法调用(ExecutableElement)的参数类
- c# - Unity 中的“鼠标 X”和“鼠标 Y”返回什么?
- c# - 通过 Partition 和 Row Key 检索数据时获取 null
- java - 类中的 main() 与接口中的 main()
- php - 未定义索引:级别
- django - 中级 Django 2.0 管理操作页面未显示
- csv - 在 NetLogo 中导入 CSV 文件