PerRequestLifetimeManager solo se puede usar en el contexto de una solicitud HTTP
Tengo una aplicación MVC que usa Unity como su contenedor IoC y tengo múltiples servicios definidos en mi aplicación usando elPerRequestLifetimeManager
.
container.RegisterType<IFileService, FileService>();
Todo funciona bien, excepto cuando traté de lanzar mi solución para automatizar tareas (como SharePoint TimerJobs), que comenzó en varios intervalos.
Para eso, he definido unServiceLocator
-Tipo de claseContainerManager
en un proyecto separado, eso hace esencialmente esto:
public static object Resolve(string typeName)
{
var type = Type.GetType(typeName);
return Resolve(type);
}
public static object Resolve(Type type)
{
object result = DependencyResolver.Current.GetService(type);
return result;
}
public static T Resolve<T>() where T : class
{
object result = DependencyResolver.Current.GetService<T>();
return (T)result;
}
public static object Resolve(string typeName)
{
var type = Type.GetType(typeName);
return Resolve(type);
}
public static object Resolve(Type type)
{
object result = DependencyResolver.Current.GetService(type);
return result;
}
public static T Resolve<T>() where T : class
{
object result = DependencyResolver.Current.GetService<T>();
return (T)result;
}
Y dentro de mi "TaskManager" hago lo siguiente:
var unitOfWork = ContainerManager.Resolve<IFileService>();
Ahora esto funciona cuando se inicia manualmente (cuando se origina en una HttpRequest). Sin embargo, esto no funciona cuando se inicia a través de mi hilo de fondo.
Intenté llamar a la unidad directamente (sin mi ServiceLocator), pero luego obtendré la excepción:PerRequestLifetimeManager can only be used in the context of an HTTP request
Así es como creo mis tareas:
private ITask CreateTask()
{
ITask task = null;
if (IsEnabled)
{
var type = System.Type.GetType(Type);
if (type != null)
{
object instance = ContainerManager.Resolve(type);
if (instance == null)
{
// Not resolved
instance = ContainerManager.ResolveUnregistered(type);
}
task = instance as ITask;
}
}
return task;
}
¿Qué me estoy perdiendo?