Этот пост относится к предварительной версии Managed Extensibility Framework Preview 2.
Итак, я пробежался по MEF и быстро написал «Hello World», который представлен ниже. Я должен сказать, что в это было очень легко погрузиться и понять. Система каталогов великолепна и позволяет легко расширять сам MEF. Просто указать ему каталог сборок надстроек и позволить ему обработать все остальное. Наследие MEF, ala Prism, безусловно, прослеживается, но я думаю, было бы странно, если бы это не было, учитывая, что оба фреймворка связаны с композицией.
Я думаю, что больше всего меня беспокоит «магия» _container.Compose (). Если вы посмотрите на класс HelloMEF, вы увидите, что поле приветствия никогда не инициализируется никаким кодом, что просто забавно. Я думаю, что предпочитаю работать с контейнерами IoC, когда вы явно просите контейнер создать для вас объект. Интересно, подойдет ли какой-нибудь универсальный инициализатор «Ничего» или «Пустой». т.е.
private IGreetings greetings = CompositionServices.Empty<IGreetings>();
Это, по крайней мере, заполняет объект «чем-то» до тех пор, пока не запустится код композиции контейнера, чтобы заполнить его настоящим «чем-то». Я не знаю - это немного попахивает ключевыми словами Visual Basic Empty или Nothing, которые мне всегда не нравились. Если у кого-то еще есть какие-то мысли по этому поводу, я бы хотел их услышать. Может, мне просто нужно смириться с этим. Он отмечен большим жирным атрибутом [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();
}
}
}
person
Andy S
schedule
11.09.2008