Czym różni się i cel MEF od jedności?

Dopiero zaczynam studia DI (pracuję na WPF / Silverlight ale mam plan na przeprowadzkę do ASP.NET). po przeczytaniu kilku artykułów DI z Internetu są dwa frameworki, które mnie interesują, MEF i Unity. Chcę wiedzieć, czym różni się świat rzeczywisty między nimi i który jest dobry.

Author: Anonymous, 2011-05-10

2 answers

Główna różnica polega na tym, że w unity będziesz wyraźnie rejestrować każdą klasę, której chcesz użyć w kompozycji:

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

W MEF z drugiej strony, oznaczasz klasy atrybutami zamiast rejestrować je gdzie indziej:

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

Na pierwszy rzut oka wygląda to na drobną różnicę składniową, ale jest to w rzeczywistości ważniejsze niż to. MEF został zaprojektowany, aby umożliwić dynamiczne odkrywanie części. Na przykład za pomocą DirectoryCatalog możesz zaprojektować swoją aplikację w taki sposób, że można go rozszerzyć, po prostu upuszczając nowe biblioteki DLL w folderze aplikacji.

W tym przykładzie MEF znajdzie i utworzy instancje wszystkich klas z atrybutem [Export(typeof(IPlugin))] w podanym katalogu i przekaże te instancje do konstruktora 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()
    {
        // ...
    }
}

Punkt wejścia:

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

Aby uwzględnić tak dynamiczne scenariusze kompozycji, MEF ma pojęcie "stabilnej kompozycji", co oznacza, że gdy znajdzie się gdzieś w brakującej zależności, po prostu oznaczyć część jako niedostępny i i tak będzie kontynuował skład.

Stabilna kompozycja może być bardzo przydatna , ale również utrudnia debugowanie nieudanej kompozycji . Jeśli więc nie potrzebujesz dynamicznego odkrywania części i "stabilnego składu", użyłbym zwykłego kontenera DI zamiast MEF. W przeciwieństwie do MEF, zwykłe kontenery DI dają wyraźne komunikaty o błędach, gdy brakuje zależności.

Może być również możliwe, aby uzyskać najlepsze z obu światów za pomocą kontener DI, który integruje się z MEF, jak Autofac . Użyj Autofac, aby skomponować podstawową aplikację, a MEF dla części, które muszą być dynamicznie rozszerzalne.

 61
Author: Wim Coenen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-10 17:42:39

Istnieje wiele opcji wykonywania DI. Przede wszystkim powinieneś zdać sobie sprawę, że DI nie chodzi o narzędzia, ale raczej o wzorce i zasady. Możesz używać DI dobrze bez narzędzia. Jeśli to zrobisz, nazwiemy to DI .

Jednakże, istnieje wiele kontenerów DI dostępnych dla. Net. Unity jest tylko jednym z nich.

MEF wygląda jak kontener DI, ale obecnie rozwiązuje inny problem-rozszerzalność. Zamiast zewnętrznego konfiguracja komponentów (których używają wszystkie kontenery DI) wykorzystuje oparty na atrybutach mechanizm wykrywania .

 18
Author: Mark Seemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:09