Ресурсы и примеры использования MEF для DI / IoC

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

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

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


person Community    schedule 25.06.2009    source источник


Ответы (1)


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

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

person Community    schedule 26.06.2009