【发布时间】:2018-09-18 15:40:10
【问题描述】:
我使用 Autofac 和 asp.net MVC 5,以及通用存储库模式
我创建自定义 RoleProvider
自定义角色提供者
namespace Web.Utility.Classes
{
class GoldenBodyProvider : RoleProvider
{
private readonly IUnitOfWork _unitOfWork;
private readonly IService _service;
public GoldenBodyProvider()
{
}
public GoldenBodyProvider(IUnitOfWork unitOfWork, IService service)
{
_unitOfWork = unitOfWork;
_service = service;
}
public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}
public override string[] GetRolesForUser(string username)
{
var role = (from u in _service.UserRepository.GetAll()
join r in _service.RoleRepository.GetAll() on u.RoleId equals r.Id
where u.MobileNumber == username
select r.RoleInSystem).ToArray();
return role;
}
public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}
public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}
public override string[] GetAllRoles()
{
throw new NotImplementedException();
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}
public override string ApplicationName { get; set; }
}
}
在名为User.IsInRole("Coach")的视图之一中(GetRolesForUser 方法在 RoleProvider 中被调用)。之后,在 RoleProvider 中的GetRolesForUser 方法中给我一个错误:
对象引用未设置为对象的实例。
错误指向_service.UserRepository.GetAll(),这个方法是通过autofact注入RoleProvider
来源错误:
GenericRepository 模式中的第 31 行:public override string[] GetRolesForUser(string 用户名)
第 32 行:{
第 33 行:var role = (from u in _service.UserRepository.GetAll()
第 34 行:将 r 加入 _service.RoleRepository.GetAll() on u.RoleId 等于 r.Id
第 35 行:其中 u.MobileNumber == 用户名
源文件:I:\GBWork\GoldenBody\Web\Utility\Classes\GoldenBodyProvider.cs 行:33
GetAll() 方法是:
public virtual List<T> GetAll()
{
return _t.AsParallel().ToList();
}
我认为注射不能正常工作。
autofac 配置:
#region Autofac
var builder = new ContainerBuilder();
#region Registery
#region MVC Register
//This allows you to add properties to your filter attributes and any matching dependencies that are registered in the container will be injected into the properties.
builder.RegisterFilterProvider();
// You can register controllers all at once using assembly scanning...
builder.RegisterControllers(typeof(Global).Assembly);
builder.RegisterModule<AutofacWebTypesModule>();
builder.RegisterAssemblyTypes(Assembly.Load("ServiceLayer"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces()
.InstancePerRequest();
builder.RegisterType(typeof(GoldenBodyDb)).As(typeof(IUnitOfWork)).InstancePerRequest();
#endregion
#region WebApi
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers
//زیرا کنتلر های وب ای پی آی در همین اسمبلی می باشد
#endregion
#endregion
var container = builder.Build();
// Set the dependency resolver for Web API.
var webApiResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;
// Set the dependency resolver for MVC.
var mvcResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(mvcResolver);
#endregion
我在哪里做错了?我的问题在哪里?有什么解决办法?
【问题讨论】:
-
您是否调试并检查
_service或_service.UserRepository或_service.RoleRepository是否为空?你也可以分享一下autofac配置吗? -
尝试删除
GoldenBodyProvider中的公共无参数构造函数。如果您在 Autofac 中正确注册了存储库类,则应使用具有自动注入参数的构造函数,并且将实例化这些存储库。如果您在问题中提供您的 autofac 配置,将会有所帮助。 -
@ChetanRanpariya 添加 autofac 配置,获取所有方法返回值
-
@Diana 添加了 autofac 配置,我删除了
GoldenBodyProvider(IUnitOfWork unitOfWork, IService service)但同样的错误 -
@arman 看起来你的
GoldenBodyProvider没有被依赖注入实例化,因此_service为空,从而导致此错误。
标签: c# asp.net-mvc autofac