Внедрение свойств Autofac

Я в процессе изменения моего проекта 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
        };
    }
}

Итак, моя проблема / вопросы:

  1. Мне не нравится этот прямой доступ к свойству OpenAccess db в OnActionExecuting.
  2. Я бы хотел, чтобы этот AuditInfo вводился в любое свойство AuditInfo где угодно
  3. Я не думаю, что могу использовать внедрение конструктора для AuditInfo, потому что службы зависят от db - контроллеры зависят от служб - db зависит от AuditInfo НО AuditInfo недоступен, пока контроллер не будет создан и не получит свой первый запрос. => круговая зависимость ...

Как мне настроить autofac для внедрения AuditInfo в любой класс, имеющий его в качестве свойства? Или есть лучший способ обойти циклическую зависимость и использовать какую-либо форму свойств лямбда / ленивого конструктора?

Это вообще касается того, что AuditInfo потенциально без необходимости повторно инициализируется при каждом запросе, даже если много запросов может быть частью одного сеанса и не иметь другого IP-адреса / информации о пользователе?

Спасибо

6
задан t316 5 October 2011 в 18:50
поделиться