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.
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.
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 .
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