Это своего рода продолжение одного из моих предыдущих постов, которое касается разрешения модулей в моем приложении WPF. Этот вопрос конкретно связан с влиянием взаимозависимостей модулей и метода построения этих модулей (т. Е. Через MEF или через new
) на способность MEF разрешать отношения.
Я пробовал два подхода:
- левый подход: приложение реализует IError
- правильный подход: в приложении есть элемент, который реализует IError
Подъезд налево
Мой код был похож на это (только материал, связанный с MEF):
// app.cs
[Export(typeof(IError))]
public partial class Window1 : Window, IError
{
[Import]
public CandyCo.Shared.LibraryInterfaces.IPlugin Plugin { get; set; }
[Import]
public CandyCo.Shared.LibraryInterfaces.ICandySettings Settings { get; set; }
private ICandySettings Settings;
public Window1()
{
// I create the preferences here with new, instead of using MEF. I wonder
// if that's my whole problem? If I use MEF, and want to have parameters
// going to the constructor, then do I have to [Export] a POCO (i.e. string)?
Settings = new CandySettings( "Settings", @"c:\settings.xml");
var catalog = new DirectoryCatalog( ".");
var container = new CompositionContainer( catalog);
try {
container.ComposeParts( this);
} catch( CompositionException ex) {
foreach( CompositionError e in ex.Errors) {
string description = e.Description;
string details = e.Exception.Message;
}
throw;
}
}
}
// plugin.cs
[Export(typeof(IPlugin))]
public class Plugin : IPlugin
{
[Import]
public CandyCo.Shared.LibraryInterfaces.ICandySettings CandySettings { get; set; }
[Import]
public CandyCo.Shared.LibraryInterfaces.IError ErrorInterface { get; set; }
[ImportingConstructor]
public Plugin( ICandySettings candy_settings, IError error_interface)
{
CandySettings = candy_settings;
ErrorInterface = error_interface;
}
}
// candysettings.cs
[Export(typeof(ICandySettings))]
public class CandySettings : ICandySettings
{
...
}
Правостороннее приближение
В основном так же, как и в левостороннем подходе, за исключением того, что я создал класс, который наследуется от IError в той же сборке, что и Window1. Затем я использовал [Import], чтобы попытаться заставить MEF решить эту проблему для меня.
Может кто-нибудь объяснить, как два подхода, которые я подошел к MEF, здесь несовершенны? Я был в неведении так долго, что вместо того, чтобы читать о MEF и пробовать разные предложения, я добавил MEF к своему решению и вхожу в код. Часть, где он выглядит так, как будто он терпит неудачу, это когда он вызывает partManager.GetSavedImport()
. По какой-то причине importCache имеет значение null, чего я не понимаю. Вплоть до этого момента он просматривал часть (Window1) и пытался разрешить два импортированных интерфейса - IError и IPlugin. Я ожидал, что он введет код, который просматривает другие сборки в той же исполняемой папке, а затем проверит его на экспорт, чтобы он знал, как разрешить импорт ...
Я обнаружил ошибку в своем коде, и когда я исправил ее, исключение MEF изменилось и стало более полезным. В нем четко указано, что не удалось найти конструктор CandySettings по умолчанию! И копая больше, я нашел хороший пост от Гленна Блока , который обсуждает это. Поэтому мне нужно закончить читать и посмотреть, подойдет ли его обходной путь или нет. Я все равно буду признателен за дополнительные ответы, поскольку неясно, является ли обходной путь правильным или нет.