Этот пост относится к предварительному просмотру платформы управляемой расширяемости 2.
Итак, я пробежался по MEF и написал быстрый «Hello World», который представлен ниже. Я должен сказать, что было очень легко погрузиться и понять. Система каталогов великолепна и делает расширение MEF очень простым. Тривиально указать его на каталог сборок надстройки и позволить ему обрабатывать все остальное. Наследие MEF ala Prism, конечно, хорошо видно, но я думаю, что было бы странно, если бы это не так, учитывая, что обе структуры касаются композиции.
Я думаю, что в моем зобе больше всего проявляется "магия" _container.Compose (). Если вы заглянете в класс HelloMEF, то увидите, что поле приветствия никогда не инициализируется каким-либо кодом, что просто смешно. Я думаю, что я предпочитаю, как работают контейнеры IoC, когда вы явно просите контейнер создать объект для вас. Интересно, может быть в порядке какой-то общий инициализатор «Nothing» или «Empty». т.е.
private IGreetings greetings = CompositionServices.Empty<IGreetings>();
Это, по крайней мере, заполняет объект «чем-то» до тех пор, пока не будет запущен код композиции контейнера, чтобы заполнить его реальным «чем-то». Я не знаю - это немного попирает ключевые слова Visual Basic «Пусто» или «Ничего», которые мне всегда не нравились. Если у кого-то еще есть мысли по этому поводу, я бы хотел их услышать. Может быть, это то, что мне просто нужно преодолеть. Он помечен большим жирным атрибутом [Import], так что это не полная тайна или что-то еще.
Контроль времени жизни объекта неочевиден, но по умолчанию все является одноэлементным, если только вы не добавите атрибут [CompositionOptions] в экспортируемый класс. Это позволяет вам указать либо Factory, либо Singleton. Было бы неплохо увидеть Pooled добавленным в этот список в какой-то момент.
Мне не совсем понятно, как работают функции утки. Это больше похоже на внедрение метаданных при создании объекта, а не на типизацию утки. И, похоже, вы можете добавить только одну дополнительную утку. Но, как я уже сказал, я пока не совсем понимаю, как эти функции работают. Надеюсь, я смогу вернуться и заполнить это позже.
Я думаю, что было бы неплохо создать теневые копии библиотек DLL, которые загружены DirectoryPartCatalog. Прямо сейчас библиотеки DLL заблокированы, как только MEF овладеет ими. Это также позволит вам добавить наблюдателя каталога и ловить обновленные надстройки. Это было бы довольно мило ...
Наконец, я беспокоюсь о том, насколько доверенными являются надстройки DLL и как, или если, MEF будет вести себя в среде с частичным доверием. Я подозреваю, что приложения, использующие MEF, потребуют полного доверия. Также может быть целесообразно загрузить надстройки в свой собственный домен приложений. Я знаю, что это немного напоминает System.AddIn, но это позволило бы очень четко разделить пользовательские надстройки и системные надстройки.
Хорошо - достаточно болтовни. Вот Hello World в MEF и C #. Наслаждайтесь!
using System;
using System.ComponentModel.Composition;
using System.Reflection;
namespace HelloMEF
{
public interface IGreetings
{
void Hello();
}
[Export(typeof(IGreetings))]
public class Greetings : IGreetings
{
public void Hello()
{
Console.WriteLine("Hello world!");
}
}
class HelloMEF : IDisposable
{
private readonly CompositionContainer _container;
[Import(typeof(IGreetings))]
private IGreetings greetings = null;
public HelloMEF()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
_container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
}
public void Run()
{
greetings.Hello();
}
public void Dispose()
{
_container.Dispose();
}
static void Main()
{
using (var helloMef = new HelloMEF())
helloMef.Run();
}
}
}