Итак, я играю с MEF - вроде классического IoC - внедряю класс логирования.У меня это работает, но работает не так, как я ожидал.Можете ли вы сказать мне, где я не в курсе?
Я думаю, что моя проблема в том, что я неправильно загружаю MEF.Я ожидал экспортировать регистратор и импортировать его, чтобы внедрить его в любой класс, который хотел его использовать.
Я обнаружил, что для любого класса, который хочет его использовать, я должен создать новыйконтейнер, загрузите каталоги и вызовите ComposeParts ().(что на самом деле намного сложнее, чем просто вызов MyEventLogFactory.GetEventLog ()).(Я ожидал, что нужно будет запустить MEF один раз, при инициализации программы, но мне, похоже, придется делать это для каждого класса, который находится в импорте)
Вот мой код начальной загрузки (при запуске консольного приложения):
static void Main(string[] args)
{
InitMefContainer();
var test = new TestHarness();
test.RunTest();
Console.ReadLine();
}
private static void InitMefContainer()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(typeof(EventLogFactory).Assembly));
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
var container = new CompositionContainer(catalog);
container.ComposeParts();
_Container = container;
}
Тогда мой класс TestHarness выглядит следующим образом:
public class TestHarness
{
[Import(typeof(IEventLog))]
public IEventLog EventLog { get; set; }
public void RunTest()
{
// did not expect to need to do this, but EventLog is null if I don't
Program._Container.ComposeParts(this);
this.EventLog.Write(some test event stuff);
}
}
Моя проблема в том, что EventLog всегда равен нулю.- Если я не повторю весь код MefInitialization, который выполнял Program.Main (или, если я сделаю контейнер, в котором Program создала общедоступную статическую структуру, я могу вызвать _Container.ComposeParts (this);
Итак, мойвопрос: как правильно загрузить MEF так, чтобы он удовлетворял всем моим импортам? Является ли обычной практикой наличие общедоступного статического контейнера и вызов контейнера Container.Compose (this)? (или использование AStaticContainer.GetExportedValue, вроде как выбудет использовать ServiceLocator.GetService () - во всех моих классах - я определенно не видел этого ни в одном из примеров кода.