3

사용자 정의 범위 라이프 스타일을 추가 할 수 있도록 custom Scope Accessor (DefaultLifetimeScope를 반환 함)을 만들었습니다. 구성 요소는 다음Castle Windsor의 특정 Custom Scoped 라이프 스타일을 "BeginScope"하는 방법은 무엇입니까?

Component 
    .For<..> 
    .LifestyleScoped<CustomScope>() 

그러나, 나는 실제로 새로운 CustomScope 범위/수명 시작 하는 방법으로 딱하다로 등록됩니다. The documentation shows

using (Container.BeginScope()) { 
    // .. 
} 

을 사용하여 새 범위를 시작하지만 내 목표는 일반적인 LifestyleScoped() 등록을위한 특정 범위가 아닌 것을 생성/시작/시작하는 것입니다. 새 범위는 CustomScope에 명시 적으로 등록 된 구성 요소에만 영향을 주어야합니다. 다른 범위의 라이프 스타일에 대해 등록 된 일반 범위 구성 요소 또는 구성 요소가 아닙니다.

(내 사용자 정의 범위) 스코프/수명을 시작하는 프로세스는 무엇입니까?

관련 문서로 링크하십시오. 내가 쉽게 찾을 수 없기 때문에 내가 묻고있는 것처럼. 이 코드는 Castle Windsor 3.3을 사용하고 있습니다.


배경 :

내가 Autofac에서 오는 오전과 EF 컨텍스트를 통해 UOW를 구축하는 Instance Per Matching Lifetime Scope에 해당 찾고 있어요. 요청 당 여러 개의 UoW가있을 수 있으며 여러 저장소에 대해 서로 다른 UoW가있을 수 있습니다. 향후 중첩을 지원할 수도 있습니다.

UoW 패턴을 만드는 것에 관한 수많은 기사가 있지만 HTTP 또는 WFC 요청과 같은 일부 컨텍스트에는 [모든] 묶여 있습니다 (잘못, IMOHO) -이 질문에 관한 내용이 아닙니다. 나는 콜 그래프를 통해 흐르고 사용자 블록을 사용하는 사용자 정의 범위를 시작하는 방법에 특히 관심이 있습니다.


참고 :

BoundTo() (및 LifestyleBoundTo()/LifestyleBoundToNearest()) 라이프 스타일 객체 그래프에 대해 작동 (및 형태를 변경해야 함) 등으로 전환하면 엄격이 문제에 대한 해결책/않음 아니다. 그러나 좋은 사례가 그들에게 만들어 질 수 있다면 ..

답변

1

Container.BeginScope()은 새로운 CallContextLifeTimeScope을 초기화합니다.

using Scope = Castle.MicroKernel.Lifestyle.Scoped.CallContextLifetimeScope; 

public static class LifestyleExtensions 
{ 
    public static IDisposable BeginScope(this IKernel kernel) 
    { 
     return new Scope(kernel); 
    } 
    /* rest of the code removed for simplicity */ 
} 

이 확장 방법

https://github.com/castleproject/Windsor/blob/aa9b8b353ee2e533d586495eec254e216f800c09/src/Castle.Windsor/MicroKernel/Lifestyle/LifestyleExtensions.cs

는 사용자 정의 ILifetimeScope 구현에 대해 상관하지 않는다.

Container.BeginScope()을 호출하는 대신 new CustomScope()으로 끝내면 "사용자 지정 범위가 지정된 개체"가 올바르게 릴리스되었는지 확인할 수 있습니다.

CustomScope 내에서 Container.BeginScope()으로 전화를 걸고 끝 부분에 처분하여 기본 평생 범위로 등록 된 구성 요소를 지원할 수 있습니다.

관련 문제