Медиа-браузер имеет модель поставщика, это в основном цепочка классов, вызываемых в определенном порядке для каждого объекта.Лучший способ аннотировать цепи поставщиков
Так, например, мы имеем:
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{}
Это позволяет 3-й стороны, чтобы определить свою позицию в цепочке.
Другие решения, о которых я думал, были до и после атрибута Eg.
[Before(typeof(ImageByNameProvider))]
class ImageFromMediaLocationProvider {}
Но, я не уверен, что с этим проще или сложнее программировать.
Есть ли другие решения этой проблемы? С каким решением вы бы согласились?
Может быть, я должен просто сохранить список для основных поставщиков и добавить до/после attribs для сторонних поставщиков ...
Скотт, спасибо за ваше время и задумчивый ответ, я попытаюсь расширить свой вопрос на следующий день или около того, чтобы охватить некоторые из ваших идей, это довольно сложная проблема. +1 –