Ресурсы и примеры использования MEF для DI / IoC - PullRequest
2 голосов
/ 25 июня 2009

Я искал высоко и ищу примеры использования MEF для DI. Я знаю, что это не DI, но из того, что я слышу (действительно слышу в подкастах), его можно использовать как таковое ... но я не могу найти посты или образцы в блоге.

Я уже использую MEF в этом проекте (для поддержки плагинов) и подумал, что было бы неплохо использовать и DI.

Может, я лаю не на том дереве?

1 Ответ

2 голосов
/ 27 июня 2009

Это можно описать на примере. Например, допустим, у вас есть базовая библиотека, на которой вы основываете все свои приложения. Назовите это 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");

Насколько я могу судить по литературе, в этом и заключается суть внедрения зависимости.

...