加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – Autofac属性注入

发布时间:2020-12-16 03:50:06 所属栏目:asp.Net 来源:网络整理
导读:我正在改变我的Asp.Net MVC3项目,使用Autofac将服务注入我的控制器.到目前为止,这一直非常简单.我的服务都有一个Telerik OpenAccess db属性,我通过构造函数注入(在服务基类中).而且我的控制器都有服务的构造函数属性,这些属性也会被注入. 我有一个名为AuditI
我正在改变我的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的最早阶段填充,即一旦存在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基本上可以在任何地方注入任何AuditInfo属性
>我认为我不能对AuditInfo使用构造函数注入,因为服务依赖于db – 控制器依赖于服务 – db依赖于AuditInfo但是在实例化控制器并收到第一个请求之前,AuditInfo不可用. =>循环依赖…

我如何设置autofac将AuditInfo注入任何将其作为属性的类?或者是否有更好的方法来回避循环依赖并使用某种形式的lambda / lazy构造函数属性?

即使许多请求可能是同一会话的一部分并且没有不同的IP地址/用户信息,但是在每次请求时可能会不必要地重新初始化AuditInfo吗?

谢谢

解决方法

结果是 Autofac’s MVC Integration can resolve an HttpRequestBase for you.所以你不需要直接引用HttpContext.Current.Request.

Autofac在幕后实施uses HttpContext.Current.这是有效的,因为MVC框架在您的代码(或Autofac)运行之前设置HttpContext.Current.所以没有循环依赖 – 在HttpContext.Current.Request上的Request“自然存在”就像你的控制器一样多. (This question怎么解释)

所以你可以像Steven建议的那样做一个IAuditInfoFactory,但是在它的构造函数中需要一个HttpRequestBase,而不是使用HttpContext.Current,如果它让你对不引用静态变量感觉更好.

此外,没有循环依赖,如果需要,您可以构造函数注入AuditInfo:

builder.Register(c => c.Resolve<IAuditInfoFactory>().CreateNew())
    .As<AuditInfo>()
    .InstancePerHttpRequest();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读