Я в процессе изменения моего проекта Asp.Net MVC3, чтобы использовать Autofac для внедрения сервисов в мои контроллеры. Пока это было довольно просто.У всех моих сервисов есть свойство Telerik OpenAccess db, которое я добавляю через конструкторы (в базовый класс сервиса). И все мои контроллеры имеют свойства конструктора для служб, которые также вводятся.
У меня есть класс AuditInfo, который инкапсулирует проверяемые свойства контроллера:
public class AuditInfo
{
public string RemoteAddress { get; set; }
public string XForwardedFor { get; set; }
public Guid UserId { get; set; }
public string UserName { get; set; }
}
Моему свойству OpenAccess db в моих служебных классах необходимо ввести экземпляр этого класса, чтобы использовать его в качестве информации для аудита в различных базах данных. звонки.
Проблема в том, что это не класс, который может быть создан в Application_Start, потому что по крайней мере два его свойства, RemoteAddress и XForwardedFor, заполняются на самом раннем этапе OnActionExecuting, то есть после того, как переменные запроса существуют.
Поэтому я создаю экземпляр этого метода в методе OnActionExecuting моего класса BaseController как таковой:
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
};
}
}
Итак, моя проблема / вопросы:
Как мне настроить autofac для внедрения AuditInfo в любой класс, имеющий его в качестве свойства? Или есть лучший способ обойти циклическую зависимость и использовать какую-либо форму свойств лямбда / ленивого конструктора?
Это вообще касается того, что AuditInfo потенциально без необходимости повторно инициализируется при каждом запросе, даже если много запросов может быть частью одного сеанса и не иметь другого IP-адреса / информации о пользователе?
Спасибо