문제

이전에 과거에 Castle Windsor를 사용한 웹 응용 프로그램에서 Autofac의 사용을 조사하고 있습니다.

Autofac에서 내가 정말로 좋아하는 것은 Windsor에서 의존적 고고 등을 만드는 것과는 달리 Lamda 표현을 통해 동적 구성 요소 구조를 표현할 수 있다는 것입니다.

내가 가진 한 가지 시나리오는 ASP.NET 세션 레벨 범위에 특정 구성 요소를 등록하기를 원한다는 것입니다. Windsor를 사용하면 새로운 LifestyleManager를 만들/소스를 만들지 만 Autofac을 사용하면 다음을 생각해 냈습니다.

//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
    HttpContext current = HttpContext.Current;

    //HttpContext handes delivering the correct session
    Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;

    if (instance == null)
    {
        instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
        current.Session["SessionContext"] = instance;
    }

    return instance;
})
.FactoryScoped();

어느 시점에서 나는 확장 방법으로 바꿀 수 있습니다. httpcontext.current.session이 웹 앱에서만 사용해야 하므로이 값이 폭격 할 수 있습니다.

질문은 ~이야:

Autofac에서 이러한 등록을위한 모범 사례는 무엇입니까? 나는 중첩 컨테이너 등의 사용에 대해 많은 언급을 보았지만 구체적인 예제는 없으며, 위의 접근 방식에 무엇이 잘못되었는지 이해하고 싶어합니다 (내가 생각할 수있는 것은 자동 처리 자료입니다).

감사.

도움이 되었습니까?

해결책

이것은 괜찮아 보입니다.

구성 요소 'externallyOwned ()'를 표시하면 AutoFac이 호출하지 않도록합니다. Dispose() 그 위에.

여기서 유일하게 Gotchas는 세션 스코핑 구성 요소가 현재 컨테이너를 통해 자체 의존성을 해결할 수 있으므로 현재 요청에 속할 수있는 것들 (예를 들어)에 대한 참조를 보유하고 있다는 것입니다. 이는 테스트에서 쉽게 찾을 수 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top