我正在更改我的 Asp.Net MVC3 项目以使用 Autofac 将服务注入(inject)到我的 Controller 中。到目前为止,这非常简单。我的服务都有一个 Telerik OpenAccess db 属性,我通过构造函数(在服务基类中)注入(inject)该属性。而且我的 Controller 都具有用于注入(inject)的服务的构造函数属性。
我有一个名为 AuditInfo 的类,它封装了 Controller 的可审计属性:
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 属性需要将此类的实例注入(inject)其中,以便在各种数据库调用中用作审计信息。
问题是这不是一个可以在 Application_Start 实例化的类,因为它的至少两个属性 RemoteAddress 和 XForwardedFor 在 OnActionExecuting 的最早阶段填充,即一旦存在 Request 变量。
因此,我在 BaseController 类的 OnActionExecuting 方法中实例化它,如下所示:
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 注入(inject)任何将其作为属性的类?或者有没有更好的方法来回避循环依赖并使用某种形式的 lambda/lazy 构造函数属性?
即使很多请求可能是同一 session 的一部分并且没有不同的 IP 地址/用户信息,但是否会在每个请求中不必要地重新初始化 AuditInfo?
谢谢
最佳答案
原来Autofac's MVC Integration can resolve an HttpRequestBase
for you .所以你不需要引用 HttpContext.Current.Request
直接地。
Autofac 的实现 uses HttpContext.Current
在幕后。这是因为 MVC 框架设置了 HttpContext.Current
在您的代码(或 Autofac 的)运行之前。所以没有循环依赖 - HttpContext.Current.Request
上的请求“自然存在”就像在你的 Controller 中一样。 (This question 有点解释如何)
所以你可以做一个IAuditInfoFactory
正如史蒂文建议的那样,但要求 HttpRequestBase
在其构造函数中,而不是使用 HttpContext.Current
如果它让您对不引用静态变量感觉更好。
此外,没有循环依赖,您可以构造函数注入(inject) AuditInfo
如果你想:
builder.Register(c => c.Resolve<IAuditInfoFactory>().CreateNew())
.As<AuditInfo>()
.InstancePerHttpRequest();
关于asp.net-mvc-3 - Autofac 属性注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7664324/