Я работаю над изменением моего проекта Asp.Net MVC3, чтобы использовать Autofac для внедрения сервиса в мои контроллеры. До сих пор это было довольно просто. Все мои службы имеют свойство Telerik OpenAccess db, которое я вставляю через конструкторы (в базовом классе службы). И мои контроллеры имеют свойства конструктора для служб, которые также вводятся.Ввод в эксплуатацию Autofac
У меня есть класс с именем 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, то есть после того, как существуют переменные Request.
Поэтому я создаю экземпляр этого в методе 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
};
}
}
Итак - моя проблема/вопросы:
- мне не нравится этот прямой охват в в свойство OpenAccess db в OnActionExecuting.
- Я бы хотел, чтобы этот AuditInfo в основном был введен в любое свойство AuditInfo где угодно
- Не думаю, что я могу использовать инсталляцию конструктора для AuditInfo, потому что службы зависят от db-контроллеров, зависит от сервисов - db зависит от AuditInfo BUT AuditInfo недоступен, пока контроллер не будет создан и не получит свой первый запрос. => круговая зависимость ...
Как настроить autofac для вставки AuditInfo в любой класс, который имеет это свойство? Или есть лучший способ обойти круговую зависимость и использовать некоторую форму лямбда-ленивых свойств конструктора?
Действительно ли это связано с тем, что AuditInfo повторно инициализируется потенциально неоправданно при каждом запросе, даже если многие запросы могут быть частью одного и того же сеанса и не иметь другой адрес ip/user info?
Thanks
Я не согласен с проблемой/вопросом 3 - а Стивен указует, вы можете использовать 'HttpContext.Current'. Поэтому 'AuditInfo' не зависит от контроллера, поэтому нет циклической зависимости, поэтому вы можете конструктор-вставить' AuditInfo', если хотите. –
Ну, я думаю, это потому, что предлагаемое решение использует глобальную статическую переменную для ссылки на объект Request, а не на инициализацию объекта AuditInfo внутри контроллера, где естественно существует объект Request. Я думаю, что переменные сервера еще не существуют еще в Application_Start, где происходит инъекция, потому что действие нужно вызвать сначала, нет? – t316