我在改變我的Asp.Net MVC3項目中使用Autofac服務注入到我的控制器的過程。迄今爲止,這非常簡單。我的服務都有一個Telerik OpenAccess數據庫屬性,我通過構造函數注入(在服務基類中)。而且我的控制器都具有可以注入的服務的構造函數屬性。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變量)被填充。
因此,我在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數據庫屬性。
- 我想這AuditInfo基本上在被注入到任何AuditInfo財產的任何地方
- 我不認爲我可以使用構造函數注射AuditInfo因爲服務依賴於數據庫 - 控制器取決於服務 - 分貝取決於AuditInfo BUT直到控制器實例化並收到其第一個請求後,AuditInfo纔可用。 =>循環依賴...
我該如何設置autofac來將AuditInfo注入到任何具有它作爲屬性的類中?還是有避免循環依賴和使用某種形式的lambda/lazy構造函數屬性的更好方法?
是它在所有關於該AuditInfo被在即使大量的請求可以是相同會話的一部分,而不是有不同的IP地址/用戶信息的每個請求重新初始化潛在的不必要的?
謝謝
我的問題/問題不同意3 - 正如史蒂芬指出,你可以使用'HttpContext.Current'。所以'AuditInfo'不依賴於控制器,所以沒有循環依賴,所以如果你願意,你可以構造器注入'AuditInfo'。 –
嗯 - 我認爲這是因爲建議的解決方案是使用全局靜態變量來引用Request對象,而不是初始化Request對象自然存在的控制器內的AuditInfo對象。我認爲服務器變量在Application_Start中甚至不存在,因爲必須首先調用一個動作,否則會發生注入。 – t316