首页 > 解决方案 > 在无参数构造函数中解析服务会导致 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()。

标签: c#.netlinqmodel-view-controller

解决方案


看起来你的SiteRole类的生命周期比注入的要长IUserService。您应该检查它是否真的是问题的根源,并使用您的 DI 容器 API 调整注册服务的生命周期。以下是不同容器的一些链接:AutofacNInjectUnitySimple 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 容器中配置为每次调用的实例。


推荐阅读