Я начинаю использовать MEF для создания приложения на основе плагинов и медленно добавляю MEF к миксу. Существует много существующего кода, который еще не имеет ДНК MEF, но я все еще хочу вставить этот код в новые объекты, которые автоматически создаются композицией.
Давайте сделаем этот бетон.
У меня есть список объектов, которые реализуют интерфейс IFoo и работают с моделью приложения определенными, но полезными способами.
interface IFooCool : IFoo {}
class FooCool : IFooCool {...}
interface IFooAwesome : IFoo {}
class FooAwesome : IFooAwesome {}
IEnumerable<IFoo> fooCollection = ProvidedTheOldFashionWay(not, yet, MEF);
Теперь я хочу создать несколько полезных инструментов, которые отображают интерфейсы IFooX
на различные действия пользователя, такие как команды меню или нажатия кнопок.
[Export(ITool)]
class CoolTool : ITool
{
IFooCool _fooCool;
[ImportingConstructor]
CoolTool(IFooCool fooCool)
{
_fooCool = fooCool;
}
[Export(MenuAction)]
void DoSomething() { _fooCool.SomeWork(...); }
}
Вот что я хотел бы сделать:
var batch = new CompositionBatch();
foreach(var foo in fooCollection)
{
batch.AddPart(foo); //add those legacy objects to the batch
}
var catalog = new TypeCatalog(typeof(CoolTool)); //or assembly or directory, ...
var container = new CompositionContainer(catalog);
container.Compose(batch);
Будет создан экземпляр CoolTool
и ему будет передан устаревший объект FooCool
. Затем я могу получить экспортированные функции и красиво отобразить их в меню, и мы поехали. Когда пользователь щелкает пункт меню, новый CoolTool
будет использовать существующую функциональность интерфейса IFooCool
, чтобы сделать что-то, ну, круто.
Конечно, это не работает. Поскольку устаревшие объекты не относятся к экспорту, добавление их в пакет композиции не помогает. В приведенном выше коде я добавляю экземпляры foo в пакет с batch.AddPart(object)
вместо batch.AddPart(ComposablePart)
. Первый метод использует атрибутированную модель для обнаружения компонуемой информации от объекта.
Как я могу использовать вторую перегрузку? Могу ли я обернуть свой существующий объект не MEF в ComposablePart на лету? Что-то вроде:
batch.AddPart(CreateComposablePart(typeof(IFooCool), foo));
Кстати, я использую предпросмотр 8 в приложении без Silverlight.