2013-07-28 2 views
11

이것에 대해 몇 가지 질문을했지만, 필자가 따르는 정확한 문서를 가리키는 경향이 있지만 여전히 작동하지 않습니다.속성에 Autofac 속성 주입이 실패했습니다.

상당히 간단한 ASP.NET MVC 4 사이트를 구축 중이며 ActionFilterAttribute 기반 로깅을 사용할 계획입니다. 데이터베이스와 트랜잭션을 열고 단위 작업 인스턴스를 제공하는 DataAccessProvider 클래스가 있으며이를 필터 특성에 주입하려고합니다.

documentationRegisterFilterProvider()을 호출하고 관련 유형이 등록되어 있는지 확인하기 만하면됩니다. 그것은 속성을 등록 할 필요가 없다고 구체적으로 말하지만, 나는 상관없이 속성을 등록하려고 노력했다. 내 코드는 현재이 같은 같습니다 워드 프로세서의 예는 다음 바로 필터에 속성을 배치

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 

builder.Register(x => new EntityAccessProvider()) 
    .As<IDataAccessProvider>() 
    .InstancePerHttpRequest(); 

builder.RegisterType<DebugLogAttribute>().PropertiesAutowired(); 
//^I've tried it with and without this line 

builder.RegisterFilterProvider(); 
var container = builder.Build(); 

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

을, 그래서 나는 같은 일을했습니다

public class DebugLogAttribute : ActionFilterAttribute 
{ 
    private IDataAccessProvider DataAccess { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) { ... } 
    public override void OnActionExecuted(ActionExecutedContext filterContext) { ... } 
} 

워드 프로세서가 모두가 말할 required - 삽입 할 생성자조차 없습니다. 그것은 속성 주입에 의해 완료됩니다. 그러나이 코드를 실행하면 DataAccess 속성은 항상 null입니다. Autofac은 그것을 무시하는 것 같습니다. 컨트롤러에 정확하게 EntityAccessProvider을 주입했기 때문에 등록이 올바르게 작동하지만 속성에 대해 작동하지 않습니다. 내가 뭘 놓치고 있니?

답변

13

IDataAccessProvider 유형의 자산은 주입을 위해 public이어야합니다. 원하는 경우 DebugLogAttribute, IDataAccessProvider으로 표시 할 수 있으며 내부 구현으로 구현할 수 있습니다.

[DebugLogAttribute] 
public class HOmeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

internal class DebugLogAttribute : ActionFilterAttribute 
{ 
    public IDataAccessProvider DataAccess { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debugger.Break(); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debugger.Break(); 
    } 
} 

internal interface IDataAccessProvider {} 

internal class DataAccessProvider:IDataAccessProvider {} 
+0

죄송합니다. 감사! – anaximander

+0

해결책 주셔서 감사합니다 :) – Redplane

관련 문제