Estoy construyendo una aplicación MVC3 utilizando el marco de Ninject. Tengo un servicio que me lleva mucho tiempo inicializar, y al final este servicio tendrá un objeto que contiene información específica del usuario, entonces necesito reutilizar ese servicio siempre y cuando la sesión del usuario esté activa, de modo que puede evitar inicializar ese servicio una y otra vezNinject concepto de alcance de sesión en MVC3
así que mi pregunta es
Cuando ato el servicio mediante Ninject qué tipo de alcance debería recoger, no hay ninguna sesión por el alcance de Ninject, así que cuál es la mejor forma de implementar el requisito? o fui en una dirección equivocada?
He creado un proveedor personalizado para uno de mis servicios que creará el servicio en función de los datos del nombre de usuario que se toma del actual Controller.User.Identity.Name. El siguiente código no funcionará porque falta la variable local userName, ¿cómo puedo pasar el valor del nombre de usuario a mi proveedor personalizado a través de Ninject, para que pueda recogerlo desde IContext?
public class TfsConnectionManagerProvider : Provider<TfsConnectionManager>
{
protected override TfsConnectionManager CreateInstance(IContext context)
{
Uri serverUri = new Uri(ConfigurationHelper.TfsServerUrl);
// Connect to the server without impersonation
using (TfsTeamProjectCollection baseUserConnection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(serverUri))
{
// Get the identity management service
IIdentityManagementService ims = baseUserConnection.GetService<IIdentityManagementService>();
// Get the identity to impersonate
TeamFoundationIdentity identity = ims.ReadIdentity
(
IdentitySearchFactor.AccountName,
userName, //NOTE: How can I get user name value from IContext???
MembershipQuery.None,
ReadIdentityOptions.None
);
// Connect using the impersonated identity
using (TfsTeamProjectCollection impersonatedConnection = new TfsTeamProjectCollection(serverUri, identity.Descriptor))
{
WorkItemStore store = impersonatedConnection.GetService<WorkItemStore>();
return new TfsConnectionManager
{
Store = store
};
}
}
}
}
Ver también http: // stackoverflow.com/questions/4687707/ninject-per-session-singleton –