Проблема с Mef и asp.net - PullRequest
       14

Проблема с Mef и asp.net

1 голос
/ 23 августа 2009

У меня есть приложение 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") -> Модель.Модель

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Я обнаружил ошибку, у меня была сборка в папке bin с тем же именем, что и сборка MailService с моим экспортом. По какой-то причине каталог взял сборку в папке bin вместо сборки в указанном мной каталоге. Не знаю почему, но это сработало, когда я хотя бы удалил старую сборку из папки bin.

1 голос
/ 24 августа 2009

Я еще не использовал MEF в веб-приложении, но если бы я догадался, я бы предположил, что есть какая-то проблема с чтением сборок в каталоге плагинов. Возможно проблема с разрешениями или что-то. В любом случае, я бы начал с изучения DirectoryCatalog, чтобы увидеть, содержит ли он то, что вы ожидаете.

...