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

标签 asp.net-mvc-3 dependency-injection inversion-of-control autofac circular-dependency

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

    相关文章:

    asp.net-mvc - 使用 MVC 区域时如何定义自定义编辑器模板的位置?

    java - Spring 类必须是 AutoWire 属性的组件吗?

    php - Laravel 自动注入(inject)和在构造函数体中手动指定依赖有什么区别?

    c# - 依赖倒置原则和放置接口(interface)的位置

    java - 什么是简单英语的AOP、依赖注入(inject)和控制反转

    javascript - 如何从另一个 View 上编写的 JS 代码重定向到 Controller 并与其一起传递 JSON 对象

    javascript - 将 razor 对象传递给 javascript 函数

    c# - 首先使用实体​​框架代码和 IOC 容器来创建没有默认构造函数的实体

    symfony - Symfony 服务收集不同方法之间的差异

    asp.net-mvc-3 - MVC3 razor 创建 HtmlButtonExtension 时出错