Qual é o escopo do meu ObjectContext injetado pelo Ninject no meu MembershipProvider personalizado (usando o escopo de Solicitação)?
Uso o Entity Framework 4 e o ASP.NET MVC 3. Criei um provedor de associação personalizado e usei o Ninject para injetar um EFAccountRepository nele (IAccountRepository vinculado a EFAccountRepository).
Este repositório de conta possui um ObjectContext injetado nele. Eu também uso esse repositório (e outros) em meus controladores. Por esse motivo, quando vinculei o IContext ao meu ObjectContext, defino o escopo como "por solicitação" para que o ObjectContext viva apenas em uma solicitação e seja compartilhado entre os repositório
Às vezes, recebo o seguinte erro ao tentar efetuar login: "A instância do ObjectContext foi descartada e não pode mais ser usada para operações que requerem conexão."
Imagino quantas vezes o provedor de associação é instanciado. Injetei o repositório no provedor de associação marcando a propriedade do repositório com[Inject]
e chamandoKernel.Inject
noApplication_Start
função no arquivo global.asa
Se o provedor for instanciado mais de uma vez, eu precisaria injetar novamente, suponho. No entanto, não recebo uma exceção de ponteiro nulo, então não acho que seja iss
Update 1Aqui está um código:
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: Estou sempre aberto a comentários sobre o meu código em geral;).