c# - 在无参数构造函数中解析服务会导致 Repository 中出现 InvalidOperationException
问题描述
我有一个继承 RoleProvider 的自定义 SiteRole 类。我在构造函数中注入 IUserService 以执行查询以获取所有角色。
它不断抛出一个错误,即 SiteRole 类需要一个无参数构造函数。所以我最终像这样注入了 IUserService:
public SiteRole()
{
_userService = DependencyResolver.Current.GetService<IUserService>();
}
在类中,我覆盖了 GetRolesForUser 函数
public override string[] GetRolesForUser(string nickname)
{
return new string[] { _userService.GetRoleForUser(nickname) };
}
UserService 在 UserRepository 中调用此 LINQ 查询(此行抛出 System.InvalidOperationException:'操作无法完成,因为 DbContext 已被释放。')
public string GetRoleForUser(string nickname)
{
return DbContext.Users.Where(u => u.Nickname == nickname).FirstOrDefault().Role.Name;
}
关于如何解决这个问题的任何提示?您不能通过构造函数将依赖项注入 RoleProvider,因此我必须使用 DependencyResolver.Current.GetService()。
解决方案
看起来你的SiteRole
类的生命周期比注入的要长IUserService
。您应该检查它是否真的是问题的根源,并使用您的 DI 容器 API 调整注册服务的生命周期。以下是不同容器的一些链接:Autofac、NInject、Unity、Simple injector。
并且,可能会SiteRole
稍微改变你的类型——使用属性来激活UserService
而不是字段,唯一的实例是在SiteRole
实例化时创建的。
public SiteRole()
{
// this field should be removed
// _userService = DependencyResolver.Current.GetService<IUserService>();
}
// this property should be used instead of field
private IUserService UserService
{
get { DependencyResolver.Current.GetService<IUserService>(); }
}
或者在现代语法中
private IUserService UserService => DependencyResolver.Current.GetService<IUserService>();
但是要小心并检查您不会获得不受控制的UserService
实例创建数量,例如,如果它在您的 DI 容器中配置为每次调用的实例。
推荐阅读
- laravel - GoToWebinar Webhook 签名验证失败
- cassandra - Cassandra:TTL vs 动态表 vs 大量删除
- android-studio - 如何使用 Actions Builder 打开 Android 应用程序?
- vue.js - 使用 Vuex 无需预编译
- ios - Capacitor 3 React App mediaDevices 未定义,iOS 14.5
- scala - 在Scala中只返回没有函数名的值
- macos - Mac 上无法识别 Ctrl、Alt、Cmd 和 Shift 键(Unity 3D)
- javascript - 在相同对象上设置值
- reactjs - findDOMNode 在 StrictMode 中已弃用。findDOMNode 被传递了一个 Transition 的实例(由 MUI Backdrop 创建),它位于 StrictMode 内部
- java - 访问不向表中插入新值