문제

미디어 브라우저에는 공급자 모델이 있습니다. 이는 기본적으로 각 엔터티에 대해 특정 순서로 호출되는 클래스 체인입니다.

예를 들어 다음과 같습니다.

        providers = new List<IMetadataProvider>();
        providers.Add(new ImageFromMediaLocationProvider());
        providers.Add(new ImageByNameProvider());
        providers.Add(new MovieProviderFromXml());
        providers.Add(new MovieDbProvider());
        providers.Add(new TVProviderFromXmlFiles());
        providers.Add(new TvDbProvider());
        providers.Add(new VirtualFolderProvider());
        providers.Add(new FrameGrabProvider());
        providers.Add(new MediaInfoProvider());

목록에 있는 공급자의 순서는 다음과 같습니다. 중요한 더 높은 순서의 공급자가 낮은 순서의 공급자보다 우선합니다.

최근에는 이 부분을 확장 가능하게 만들려고 노력했습니다.따라서 타사 DLL은 체인에 삽입될 자체 공급자를 정의할 수 있습니다.

문제는 제3자가 체인에 자신을 주입하도록 허용하면 이 순서를 정의할 중앙 위치를 잃게 된다는 것입니다.

제가 조금 불편한 현재 솔루션은 각 공급자에 대해 선택적 우선순위 속성을 정의한 다음 우선순위별로 정렬하는 것입니다.

예를 들어 지금은 다음과 같습니다.

[ProviderPriority(20)]
class ImageByNameProvider{}

이를 통해 제3자가 체인에서 자신의 위치를 ​​정의할 수 있습니다.

내가 생각한 또 다른 솔루션은 속성 전후였습니다.

[Before(typeof(ImageByNameProvider))]
class ImageFromMediaLocationProvider {} 

그러나 이것이 프로그래밍하기 더 쉬운지 어려운지는 잘 모르겠습니다.

이 문제에 대한 다른 해결책이 있습니까?어떤 솔루션을 선택하시겠습니까?

아마도 핵심 공급자에 대한 목록을 유지하고 타사 공급자에 대한 이전/이후 속성을 추가해야 할 것입니다.

도움이 되었습니까?

해결책

여기에는 실제로 해결해야 할 몇 가지 다른 문제가 있는 것 같습니다.근본적인 문제는 기존 목록의 중간 지점에 임의의 객체를 삽입할 수 있는 메커니즘을 고안하는 것입니다.

IMetadataProvider 인터페이스가 실제로 어떻게 보이는지는 설명하지 않지만 공급자를 고유하게 식별할 수 있는 방법이 있어야 합니다(가장 좋은 옵션은 Guid를 사용하는 것입니다).클래스 이름을 사용하면 리팩토링 등을 하는 동안 필요에 따라 클래스 이름을 바꿀 수 있다는 이점이 있습니다.Guid를 동일하게 유지하는 한 사용자 지정(제3자) 공급자에게 영향을 주지 않습니다.

간단한 목록을 사용하는 대신 자신만의 목록을 파생해야 할 수도 있습니다.

class ProviderList : List<IMetadataProvider { }

이는 사용자 지정(제3자) 공급자가 해당 목록에서 자체적으로 설치/제거할 수 있는 방법을 제공합니다.이러한 메커니즘은 체인 중간에 새 공급자를 삽입하는 방법을 알 수 있을 만큼 똑똑해야 할 뿐만 아니라 삽입된 여러 사용자 지정 공급자를 처리하는 방법도 알 수 있을 만큼 똑똑해야 합니다.마찬가지로, 유사한 문제를 처리하고 누군가가 "핵심" 공급자 중 하나를 제거하려고 시도하지 않도록 제거 프로세스도 현명해야 합니다.

여기서 좋은 접근 방식은 뒤에 삽입하려는 공급자의 Guid를 매개 변수로 Install() 메서드에 전달하는 것입니다.Remove() 메서드는 마찬가지로 제거할 공급자의 Guid를 사용합니다.

예를 들어 MovieProviderFromXml 뒤에 새 공급자를 삽입한다고 가정해 보겠습니다.그런 다음 다른 제3자도 MovieProviderFromXml 다음에 새 공급자를 설치합니다.새로운 체인 순서는 어떻게 되어야 합니까?두 번째 공급자는 항상 MovieProviderFromXml 바로 뒤에 삽입합니까, 아니면 거기서 시작한 다음 사용자 지정 공급자를 건너뛰고 마지막 사용자 지정 공급자가 설치된 후에 삽입합니까(그러면 다음 "핵심" 공급자 바로 앞에)?

해당 질문과 관련하여 "핵심" 공급자와 사용자 지정 공급자를 구별할 수 있는 방법이 필요하다는 생각이 있습니다.

마지막으로, 특히 사용자 지정 공급자가 잘못된 위치에 삽입된 경우 체인의 오류를 처리할 수 있는 방법이 있는지 확인해야 합니다.

기본 체인의 기본("마스터") 목록을 항상 유지하고 싶을 것입니다.해당 체인 중간에 새 공급자가 설치되면 새 체인이 생성되어야 하지만 기본 체인이 느슨해지는 것을 원하지 않습니다.이를 통해 체인을 기본 상태로 다시 재설정할 수 있습니다.

우선순위에 따른 연결은 우선순위 충돌을 처리하는 방법을 결정해야 한다는 점에서 문제가 있습니다.이전/이후 속성 세트에 대해 동일한 제공자에서 두 가지를 모두 허용하시겠습니까?아마도 아닐 수도 있으므로 ChainInsert 열거형 속성이 있는 ProviderChainAttribute를 생성하는 것이 더 합리적일 수 있습니다. 여기서 ChainInsert는 Before 및 After 열거형 값을 정의합니다.이를 통해 사용자 정의 공급자가 이전에 설치 여부를 결정하도록 강제할 수 있습니다. 또는 지정된 공급자 뒤에.나는 여전히 유형보다는 Guid를 사용할 것입니다.

이를 통해 이 문제에 접근하는 방법에 대한 다른 아이디어를 얻을 수 있기를 바랍니다.

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