Чем отличается Меф и цель от Единства?


Я только начинаю изучать DI (я работаю над WPF / Silverlight, но у меня есть план перехода ASP.NET). после того, как я прочитал некоторые статьи DI из интернета, есть две структуры, которые меня интересуют, MEF и Unity. Я хочу знать, чем отличается реальный мир между ними и какой из них хорошо идти.

2   51   2011-05-10 15:51:25

2 ответа:

основное отличие заключается в том, что с unity вы будете явно регистрировать каждый класс, который вы хотите использовать в композиции:

var container = new UnityContainer();
container.RegisterType<IFoo,Foo>();
container.RegisterType<IBar,Bar>();
...
var program = container.Resolve<Program>();
program.Run();

в MEF, с другой стороны, вы отмечаете классы с атрибутами, а не регистрируете их где-то еще:

[Export(typeof(IFoo))]
public Foo
{
   ...
}

на первый взгляд это выглядит как незначительная синтаксическая разница, но на самом деле это более важно, чем это. MEF предназначен для динамического обнаружения деталей. Например, с помощью DirectoryCatalog вы можете создать свой приложение таким образом, что вы можете расширить его, просто отбросив новые библиотеки DLL в папке приложения.

в этом примере MEF найдет и создаст экземпляр всех классов с помощью [Export(typeof(IPlugin))] атрибут в данном каталоге и передает эти экземпляры в Program конструктора:

[Export]
public class Program
{
    private readonly IEnumerable<IPlugin> plugins;

    [ImportingConstructor]
    public Program(
       [ImportMany(typeof(IPlugin))] IEnumerable<IPlugin> plugins)
    {
        this.plugins = plugins;
    }

    public void Run()
    {
        // ...
    }
}

точка входа:

public static void Main()
{
    using (var catalog = new DirectoryCatalog(".","*"))
    using (var container = new CompositionContainer(catalog))
    {
        var program = container.GetExportedValue<Program>();
        program.Run();
    }
}

для размещения таких динамических сценариев композиции MEF имеет понятие "стабильная композиция", Что означает, что когда он сталкивается с отсутствующим зависимость где-то он просто отметит часть как недоступную и будет продолжать композицию в любом случае.

стабильный состав может быть весьма полезным, но это также делает его очень трудно отладить неудачную композицию. Поэтому, если вам не нужно динамическое обнаружение деталей и "стабильная композиция", Я бы использовал обычный контейнер DI вместо MEF. В отличие от MEF, обычные контейнеры DI дадут вам четкие сообщения об ошибках, когда зависимость недостающий.

также можно получить лучшее из обоих миров, используя контейнер DI, который интегрируется с MEF, например Autofac. Используйте Autofac для создания основного приложения и MEF для деталей, которые должны быть динамически расширяемыми.

есть много вариантов для выполнения DI. Прежде всего, вы должны понять, что DI-это не инструменты, а скорее шаблоны и принципы. Вы можете использовать DI просто отлично без инструмента. Если вы это сделаете, мы называем это бедняга Ди.

, который сказал есть много контейнеров DI, доступных для .NET. Unity является лишь одним из них.

MEF очень похож на контейнер DI, но в настоящее время решает другую проблему - это растяжимость. Вместо внешней конфигурации компонентов (которую используют все контейнеры DI) он использует атрибут на основе механизм обнаружения.