Я использую Entity Framework 4 и ASP.NET MVC 3. Я создал пользовательский поставщик членства и использую Ninject для внедрения в него EFAccountRepository (привязанный IAccountRepository к EFAccountRepository).
В этом хранилище учетной записи вставлен ObjectContext. Я также использую этот репозиторий (и другие) в моих контроллерах. По этой причине, когда я связал IContext с моим ObjectContext, я установил область действия «на запрос», чтобы ObjectContext жил только в одном запросе и был разделен между репозиториями.
Иногда я получаю следующую ошибку при попытке войти в систему: «Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения.»
Интересно, как часто создается поставщик членства. Я внедрил репозиторий в провайдер членства, пометив свойство репозитория [Inject]
и вызвав Kernel.Inject
в функции Application_Start
в файле global.asax.
Если провайдер получит инстанцию более одного раза, мне придется вводить снова, я полагаю. Тем не менее, я не получаю исключение нулевого указателя, поэтому я не думаю, что это все.
Обновление 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>();
}
}
PS: я всегда открыт для комментариев к моему коду вообще;).