내 Asp.Net MVC3 프로젝트를 변경하여 Autofac을 사용하여 컨트롤러에 서비스를 주입하는 중입니다. 지금까지 이것은 매우 직설적이었습니다. 내 서비스에는 모두 생성자를 통해 주입하는 Telerik OpenAccess db 속성이 있습니다 (서비스 기본 클래스에서). 그리고 내 컨트롤러에는 모두 주입되는 서비스에 대한 생성자 속성이 있습니다.Autofac 속성 주입
이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를 속성으로 사용하기 위해 그것을 주입이 클래스의 인스턴스를 가질 필요가 :
나는 컨트롤러의 감사 속성을 캡슐화 AuditInfo라는 클래스를 가지고 다양한 데이터베이스 호출에서 정보를 감사합니다.
문제는 OnActionExecuting의 초기 단계에서 RemoteAddress와 XForwardedFor 중 두 가지 속성 (즉, Request 변수가있는 경우)이 채워지기 때문에 Application_Start에서 인스턴스화 할 수있는 클래스가 아니라는 점입니다.
그러므로, 나는 그런 나의 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 속성에 삽입해야합니다.
- 서비스가 db - controllers에 종속되어 있기 때문에 AuditInfo에 대해 생성자 삽입을 사용할 수 있다고 생각하지 않습니다. - db는 AuditInfo에 의존하지만 AuditInfo는 컨트롤러가 인스턴스화되어 첫 번째 요청을받을 때까지 사용할 수 없습니다. => 순환 의존성 ...
AuditInfo를 등록 정보로 갖는 모든 클래스에 Autofac을 주입하도록 설정하려면 어떻게해야합니까? 아니면 순환 종속성을 피하고 λ/lazy 생성자 속성의 일부 형식을 사용하는 더 좋은 방법이 있습니까?
많은 요청이 같은 세션에 속할 수 있고 다른 IP 주소/사용자 정보가 없더라도 AuditInfo가 모든 요청에 대해 잠재적으로 불필요하게 다시 초기화된다는 점은 전혀 다른가요?
감사
- 스티븐 지적대로'HttpContext.Current'를 사용할 수 있습니다. 그래서'AuditInfo'는 컨트롤러에 의존하지 않으므로 순환 의존성이 없으므로 원하는 경우 생성자 - 주입 'AuditInfo'를 생성 할 수 있습니다. –
글쎄 - 제안 된 솔루션은 요청 개체가 자연스럽게 존재하는 컨트롤러 내부의 AuditInfo 개체를 초기화하는 대신 전역 정적 변수를 사용하여 Request 개체를 참조하기 때문입니다. 나는 서버 변수가 Application_Start에 아직 존재하지 않는다고 생각한다. Application_Start는 th injection이 발생하는 곳이다. 왜냐하면 조치가 먼저 호출되어야하기 때문이다. – t316