Это можно описать на примере. Например, допустим, у вас есть базовая библиотека, на которой вы основываете все свои приложения. Назовите это MyCompany.Core. Обычно каждое написанное вами приложение должно содержать ссылку на MyCompany.Core, а затем приложение должно позаботиться о загрузке и вызове MyCompany.Core для запуска соответствующих служб и т. Д. порядок. Это не имеет особого смысла, если учесть, что само ядро, вероятно, лучше знает, как его запускать и т. Д.
Чтобы использовать MEF для внедрения зависимостей, ваше ядро должно сделать следующее:
[Import("/Application", typeof(IBespokeApplication))]
private IBespokeApplication bespokeApplication;
Само ядро будет содержать код запуска приложения и может вызвать что-то вроде этого после запуска всех своих служб:
bespokeApplication.Start();
В специальном приложении вы должны экспортировать себя:
[Export("/Application", typeof(IBespokeApplication))]
public class MyApplication : IBespokeApplication
{
public void Start()
{
/* start app */
}
}
Теперь сделанное на заказ приложение может содержать прямую ссылку на MyCompany.Core и может напрямую вызывать службы, или вы даже можете выставлять службы как экспорты и импортировать их в приложение. Например, в ядре:
[Export("/LoggingService", typeof(ILoggingService))]
public class NLogLoggingService : ILoggingService
{
/* ... */
}
Тогда в заявке на заказ:
[Import("/LoggingService", typeof(ILoggingService))]
private ILoggingService loggingService;
... и когда вы хотите его использовать:
loggingService.LogInformation("My Message");
Насколько я могу судить по литературе, в этом и заключается суть внедрения зависимости.