我为ASP.NET MVC项目进行自定义身份验证,并使用EF 6.1.3和Ninject.MVC 3.2.1。我使用存储库和工作单元模式。
我希望在我的视图模型中使用自定义ValidationAttribute在注册时验证唯一用户名。
有时我的存储库抛出private static void RegisterServices(IKernel kernel)
{
kernel.Bind<DbContext>().To<MyPortfolioDbContext>().InRequestScope();
kernel.Bind(typeof(IDbRepository<>)).To(typeof(EfRepository<>));
kernel.Bind<Func<IUnitOfWork>>().ToMethod(ctx => () => ctx.Kernel.Get<EfUnitOfWork>());
kernel.Bind<IUnitOfWork>().To<EfUnitOfWork>();
kernel.Bind<IAuthenticationManager>().To<AuthenticationManager>();
kernel.Bind(k => k
.From("MyPortfolio.Services.Authentication", "MyPortfolio.Services.Data")
.SelectAllClasses()
.BindDefaultInterface());
}
并带有描述:
由于dbcontext已被丢弃,因此无法完成操作。
这是我的Ninject配置:
public class RegistrationValidator : ValidationAttribute
{
[Inject]
public IDbRepository<User> Users { get; set; }
public override bool IsValid(object value)
{
string username = (string)value;
bool result = true;
if (this.Users.FirstOrDefault(u => u.Username == username) != null)
{
result = false;
}
return result;
}
}
这是我的ValidationAttribute:
public class EfRepository<T> : IDbRepository<T> where T : class, IAuditInfo, IDeletableEntity
{
private IDbSet<T> dbSet;
private DbContext context;
public EfRepository(DbContext context)
{
if (context == null)
{
throw new ArgumentException("An instance of DbContext is required to use this repository.", nameof(context));
}
this.context = context;
this.dbSet = this.context.Set<T>();
}
//another methods
//the method that throw an exception
public T FirstOrDefault(Expression<Func<T, bool>> filterExpression)
{
return this.dbSet.Where(x => !x.IsDeleted).FirstOrDefault(filterExpression);
}
//another methods
}
这是我的存储库:
.section .bss
.globl var1
.size var1, 1
var1:
.skip 1
.align 16777216
.globl var2
.size var2, 1048576
.globl var3
.size var3, 1048576
.globl var4
.size var4, 1048576
var2:
var3:
var4:
.skip 1048576
.text
.globl main
main:
xor %eax, %eax
ret
如果您需要我项目的其他代码,请告诉我。
我的假设是,在将存储库注入ValidationAttribute时,Ninject使用了旧的dbContext。你有什么看法。