媒体浏览器具有一个提供者模型,这基本上是那被调用为每个实体的特定顺序的类的链。

因此,例如,我们有:

        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 {} 

不过,我不知道这是否是更容易还是更难对编程。

有没有对这个问题的任何其他解决办法?你会去与解决方案?

也许,我应该保持名单的核心供应商,并添加前/后attribs为第三方供应商...

有帮助吗?

解决方案

好像实际上这里有几个不同的问题应该得到解决。最根本的问题是试图想出一种机制,允许在该列表的中间的一些点要被插入在任意对象到现有列表。

您没有描述什么IMetadataProvider接口实际上看起来像,但它应该有一些方法来唯一地标识提供商(最好的办法是使用GUID)。在使用类名的好处是,它可以让你在不影响自定义(第三方)供应商只要重构等过程中根据需要重命名类为您保留的GUID相同。

而不是使用一个简单的列表你应该得到自己的列表:

class ProviderList : List<IMetadataProvider { }

露出的方式用于定制的(第三方)提供到安装/从该列表中卸载本身。这些机制必须足够聪明,知道如何插入新的供应商到链的中间,但也足够聪明,知道如何处理已插入多个自定义商。同样,拆除过程需要智能以及处理类似的担忧,并确保有人不尝试删除你的“芯”的供应商之一。

下面一个好的方法很可能会传给你想要被插入后作为参数传递给安装()方法提供的GUID。待除去的删除()方法将同样采取提供商的GUID。

举例来说,假设我插入MovieProviderFromXml之后一个新的供应商。然后,其他第三方也安装MovieProviderFromXml后,一个新的供应商。应该采取什么新链的顺序是什么?请问第二提供商总是立即插入MovieProviderFromXml后或者它从那里开始,然后跳过任何自定义提供并安装的最后定义提供后插入(所以只是下一个“核心”提供过吗?

与此相关的问题是,你需要有某种方式对你的“核心”提供者和自定义提供区分的想法。

最后,你需要确保有一种方法来处理链中,特别是当一个自定义提供插错位置的故障。

您确实想始终保持一个基地(“主”)列表默认链。当一个新的供应商,被安装在链的中间,应该创建一个新的链,但你不希望松散的基地链。这使您能够链条重置为默认状态的能力。

基于优先级的链接是在那么你必须决定如何处理优先的冲突问题。至于一个前/属性设置完成后,你会不会让双方在同一供应商?或许不会,所以它可能会更有意义,以创建具有ChainInsert枚举属性,其中ChainInsert定义之前和枚举值之后ProviderChainAttribute。这使您可以强制定制提供商做出决定是否之前在指定供应商后,安装。我仍然使用GUID而不是类型。

希望这提供了关于如何解决这个问题的一些其他的想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top