gpt4 book ai didi

asp.net-mvc-3 - Autofac 属性注入(inject)

转载 作者:行者123 更新时间:2023-12-04 13:43:23 25 4
gpt4 key购买 nike

我正在更改我的 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
};
}
}

所以 - 我的问题/问题是:
  • 我不喜欢直接访问 OnActionExecuting 中的 OpenAccess db 属性。
  • 我希望这个 AuditInfo 基本上被注入(inject)到任何地方的任何 AuditInfo 属性中
  • 我不认为我可以为 AuditInfo 使用构造函数注入(inject),因为服务依赖于 db - Controller 依赖于服务 - db 依赖于 AuditInfo 但在 Controller 被实例化并收到其第一个请求之前,AuditInfo 不可用。 => 循环依赖...

  • 我将如何设置 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com