媒体浏览器有一个提供者模型,这基本上是一个类链,每个实体按特定顺序调用。
例如,我们有:
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 {}
但是,我不确定这是否更容易或更难编程。
这个问题还有其他解决方案吗?你会选择哪种解决方案?
也许,我应该只保留核心提供商的列表并为第三方提供商添加之前/之后的属性......