我使用Entity Framework 4和ASP.NET MVC 3.我创建了一个自定义成员资格提供程序并使用Ninject将EFAccountRepository注入其中(将IAccountRepository绑定到EFAccountRepository).
此帐户存储库中注入了ObjectContext.我还在我的控制器中使用此存储库(和其他人).出于这个原因,当我将IContext绑定到我的ObjectContext时,我将范围设置为“每个请求”,因此ObjectContext只存在于一个请求中并在存储库之间共享.
尝试登录时,有时会出现以下错误:“ObjectContext实例已被处理,无法再用于需要连接的操作.”
我想知道会员提供商经常被实例化的频率.我通过使用[Inject]标记repository属性并在global.asax文件中的Application_Start函数中调用Kernel.Inject,将存储库注入到成员资格提供程序中.
如果提供者被多次实例化,我将不得不再次注入.但是,我没有得到空指针异常,所以我不认为是这样.
更新1
这是一些代码:
MyNinjectModule.cs
public override void Load() { Bind<IMyContext>().To<MyObjectContext>().InRequestScope(); // put bindings here Bind<IAccountRepository>().To<EFAccountRepository> }
Global.asax中
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); var kernel = new StandardKernel(new MyNinjectModule()); ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory(kernel)); kernel.Inject(Membership.Provider); }
MyMembershipProvider.cs
[Inject] public IAccountRepository accountRepository { get; set; } public override bool ValidateUser(string username,string password) { // I get the exception here. return (from a in accountRepository.Accounts where a.UserName == username && a.Password == password select true).SingleOrDefault(); }
EFAccountRepository.cs
private readonly IMyContext context; public EFAccountRepository(IMyContext context) { this.context = context; } public IQueryable<Account> Accounts { get { return context.Accounts; } }
MyObjectContext.cs
public class MyObjectContext : ObjectContext,IMyContext { public IObjectSet<Account> Accounts { get; private set; } public FlorenceObjectContext() : this("name=DomainModelContainer") { } public FlorenceObjectContext(string connectionString) : base(connectionString,"DomainModelContainer") { Accounts = CreateObjectSet<Account>(); } }