У меня есть приложение asp.net, использующее сборку модели (с классом Model) для бизнес-логики. Эта сборка модели зависит от MailService через интерфейс IMailService, и я пытаюсь использовать MEF для заполнения Моделей, необходимых для реализации MailService. Я делаю композицию MEF в конструкторе класса Model.
Идея заключается в том, чтобы создать сборку MailService, которую я могу повторно использовать между моими веб-сайтами, при этом самим сайтам не нужно знать, как отправляется почта. Возможно, лучше выбрать контейнер IoC, но я просто думаю, что подход MEF проще для понимания, и мне нравится идея составления моих приложений путем объединения частей. Также есть ли у подхода mef какие-либо отрицательные стороны, если сравнивать с контейнером IoC?
[Import]
private IMailService _mailService;
public Model()
{
Compose();
}
private void Compose()
{
DirectoryCatalog cat = new DirectoryCatalog(Settings.Default.PluginsFolder);
var container = new CompositionContainer(cat);
container.ComposeParts(this);
}
Код ниже находится в другой сборке, а интерфейс - в другой сборке
[Export(typeof(IMailService))]
public class MailService : IMailService
{
}
это прекрасно работает в моих модульных тестах для сборки модели, но когда я использую сборку модели через мой сайт asp.net, она завершается с ошибкой, за исключением ниже. Я также попытался установить полное доверие в web.config, но все равно не повезло
Состав остается без изменений.
изменения были отклонены из-за
следующие ошибки: Композиция
произвел единственную ошибку композиции.
Основная причина приведена ниже.
Просмотрите CompositionException.Errors
недвижимость для более подробной
информация.
1) Не найдено ни одного экспорта, соответствующего
ограничение
'((exportDefinition.ContractName =
"ExtensionInterfaces.IMailService") &&
(ExportDefinition.Metadata.ContainsKey ( "ExportTypeIdentity")
&&
"ExtensionInterfaces.IMailService" .equals (exportDefinition.Metadata.get_Item ( "ExportTypeIdentity")))).
Результат: невозможно установить импорт
Model.Model._mailService
(ContractName = "ExtensionInterfaces.IMailService")»
по части Model.Model '. Элемент:
Model.Model._mailService
(ContractName = "ExtensionInterfaces.IMailService")
-> Модель.Модель