Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public interface IStrategy {
int Algorithm(int num);
}
public sealed class Strategy : IStrategy {
public int Algorithm(int num) {
return num*2;
}
}
public sealed class Calculator {
private readonly IStrategy _strategy;
public Calculator(IStrategy strategy) {
_strategy = strategy;
}
public int Calculate() {
return _strategy.Algorithm(42);
}
}
public static class Program {
private static void Main(string[] args) {
var rb = new RegistrationBuilder();
rb.ForTypesDerivedFrom<IStrategy>().Export<IStrategy>();
rb.ForType<Calculator>().Export();
var cc = new CompositionContainer(
new AggregateCatalog(new AssemblyCatalog(typeof (Program).Assembly, rb)));
var calc = cc.GetExportedValue<Calculator>();
Console.WriteLine(calc.Calculate());
Console.ReadLine();
}
}
[TestMethod]
public void TestMethod() {
var calc = new Calculator(
Mock.Of<IStrategy>(s => s.Algorithm(It.IsAny<int>()) == 42)
);
calc.Calculate().Should().Be(42);
}
но когда надо автоматически инжектить логгер с именем класса и с возможностью оверрайда этого имени — MEF уже не крут,
использовать ленивую инициализацию зависимостей из текущего скоупа выполнения в single instance объект — MEF уже не крут
Лайфтайм менеджмент в MEF?
И кстати, с ликвидацией то же проблем не будет в нормальном контейнере.
Ну контейнер то как раз и создан, что бы быть универсальной фабрикой=)
Он просто реализует интерфейсы, а я, в свою очередь, могу ему и логгеры разные давать и доп. сервисы инджектить
Ну и самое главное, это то, что для MEF необходимо в свой код тащить специфичные для контейнера атрибуты.
Допускаю, что при определенном рвении можно над MEF нарисовать это все, но зачем?Многия знания, как говорится, рождают многия печали. :) Обилие возможностей приводит к каше на проекте, когда сложно разобраться, какой объект как получается и что из себя представляет (это, конечно, на больших проектах и в команде чувствуется).
Руководство разработчика Prism — часть 3, управление зависимостями между компонентами