【发布时间】:2010-10-17 22:38:19
【问题描述】:
媒体浏览器有一个提供者模型,这基本上是一个类链,每个实体按特定顺序调用。
所以例如我们有:
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 方定义他们在链中的位置。
我想到的另一个解决方案是属性Eg之前和之后。
[Before(typeof(ImageByNameProvider))]
class ImageFromMediaLocationProvider {}
但是,我不确定这是更容易还是更难编程。
这个问题还有其他解决方案吗?你会选择哪种解决方案?
也许,我应该只保留核心提供商的列表,并为第三方提供商添加之前/之后的属性......
【问题讨论】: