Media Browserにはプロバイダーモデルがあります。これは基本的に、エンティティごとに特定の順序で呼び出されるクラスのチェーンです。
たとえば、次のようになります。
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は、チェーンに挿入される独自のプロバイダーを定義できます。
問題は、サードパーティがチェーンに自分自身を注入できるようにすると、この順序を定義するための中心的な場所を失うことです。
私が少し不快な現在の解決策は、各プロバイダーでオプションの優先度属性を定義してから、優先度で並べ替えることです。
たとえば、私は今持っています:
[ProviderPriority(20)]
class ImageByNameProvider{}
これにより、サードパーティはチェーン内での位置を定義できます。
私が考えた別の解決策は、属性の前後でした。
[Before(typeof(ImageByNameProvider))]
class ImageFromMediaLocationProvider {}
しかし、これに対してプログラミングするのが簡単なのか難しいのかはわかりません。
この問題に対する他の解決策はありますか?どのソリューションを使用しますか?
おそらく、コアプロバイダーのリストを保持し、サードパーティプロバイダーのBefore/After属性を追加する必要があります...