Estoy en el proceso de cambiar mi proyecto Asp.Net MVC3 para usar Autofac para la inyección de servicio en mis controladores. Hasta ahora, esto ha sido bastante sencillo. Todos mis servicios tienen una propiedad Telerik OpenAccess db que inyecté a través de los constructores (en una clase base de servicio). Y todos mis controladores tienen propiedades de construcción para servicios que también se inyectan.Inyección de propiedad Autofac
tengo una clase llamada AuditInfo que encapsula las propiedades auditables de un controlador:
public class AuditInfo
{
public string RemoteAddress { get; set; }
public string XForwardedFor { get; set; }
public Guid UserId { get; set; }
public string UserName { get; set; }
}
Mi OpenAccess propiedad db en mis clases de servicio debe tener una instancia de esta clase se inyecta a ella con el fin de utilizar como auditando información en varias llamadas a la base de datos.
El problema es que esta no es una clase que se puede instanciar en Application_Start porque al menos dos propiedades de ella, RemoteAddress y XForwardedFor se rellenan en la etapa más temprana de OnActionExecuting, es decir, una vez que existen las variables de solicitud.
Por lo tanto, ejecutar este método en el OnActionExecuting de mi clase BaseController como tal:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
db.AuditInfo = AuditInfo;
}
public AuditInfo AuditInfo
{
get
{
return new AuditInfo()
{
RemoteAddress = this.Request.ServerVariables["REMOTE_ADDR"],
XForwardedFor = this.Request.ServerVariables["X_FORWARDED_FOR"],
UserId = this.UserId,
UserName = this.UserName
};
}
}
Por lo tanto - mi problema/preguntas son:
- no me gusta este alcance directo de a la propiedad OpenAccess db en OnActionExecuting.
- me gustaría este AuditInfo básicamente a inyectar en cualquier propiedad en cualquier lugar AuditInfo
- no creo que pueda usar la inyección de constructor para AuditInfo porque los servicios dependen de db - controladores dependen de los servicios - db depende de AuditInfo PERO AuditInfo no está disponible hasta que se crea una instancia de un controlador y se recibe su primera solicitud. => dependencia circular ...
¿Cómo configuraría autofac para que inserte AuditInfo en cualquier clase que lo tenga como propiedad? ¿O hay una mejor manera de eludir la dependencia circular y usar alguna forma de propiedades de constructor lambda/perezoso?
¿Es en absoluto preocupante que AuditInfo se reinicialice potencialmente innecesariamente en cada solicitud, aunque muchas solicitudes pueden ser parte de la misma sesión y no tener direcciones IP/información de usuario diferentes?
Gracias
estoy de acuerdo con problema/pregunta 3 - como señala Steven se puede usar 'HttpContext.Current'. Así que 'AuditInfo' no depende del controlador, por lo que no existe una dependencia circular, por lo que podría crear el constructor' AuditInfo' si lo desea. –
Bueno, creo que esto se debe a que la solución propuesta está utilizando una variable estática global para hacer referencia al objeto Request en lugar de inicializar el objeto AuditInfo dentro del controlador donde el objeto Request existe de forma natural. Creo que las variables del servidor ni siquiera existen en Application_Start, donde se está produciendo la inyección, porque una acción debe llamarse primero, ¿no? – t316