Я нахожусь в процессе изменения моего проекта Asp.Net MVC3 для использования Autofac для внедрения услуг в мои контроллеры.Пока это было довольно просто.Все мои сервисы имеют свойство db Telerik OpenAccess, которое я внедряю через конструкторы (в базовом классе обслуживания).И все мои контроллеры имеют свойства конструктора для сервисов, которые также вводятся.
У меня есть класс 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 в моем сервисеклассы должны иметь экземпляр этого класса, внедренный в него для использования в качестве информации аудита в различных вызовах базы данных.
Проблема в том, что это не тот класс, который может быть создан в 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
};
}
}
Итак, мои проблемы / вопросы:
- Не знаюкак этот прямой доступ к свойству db OpenAccess в OnActionExecuting.
- Я бы хотел, чтобы этот AuditInfo в основном внедрялся в любое свойство AuditInfo в любом месте
- Я не думаю, что могу использовать конструкторвнедрение для AuditInfo, поскольку службы зависят от db - контроллеры зависят от служб - db зависит от AuditInfo, НО AuditInfo недоступен, пока не будет создан экземпляр контроллера и не получит свой первый запрос.=> циклическая зависимость ...
Как мне настроить автозапуск для внедрения AuditInfo в любой класс, который имеет это свойство?Или есть лучший способ обойти циклическую зависимость и использовать некоторую форму свойств конструктора lambda / lazy?
Это вообще касается того, что AuditInfo может быть повторно инициализирован потенциально без необходимости при каждом запросе, даже если много запросовможет быть частью одного сеанса и не иметь другого IP-адреса / информации о пользователе?
Спасибо