Я пытаюсь внедрить базовую систему загрузки модулей в своем приложении, где я использую Unity для обработки DI. Я думал, что будет легко использовать FileSystemWatcher и MEF для добавления динамической загрузки, но я столкнулся с проблемой.Сотрудничество Unity и MEF
Введение
При регистрации каталога с модулями ввода считанных модулей, которые в настоящее время присутствуют в каталоге и создать FileSystemWatcher
public List<IModule> RegisterModule(string directoryUri){
var fsw = new FileSystemWatcher(directoryUri, "*.dll");
fsw.Created += OnModulesChange;
fsw.EnableRaisingEvents = true;
return GetModules();
}
В обработчике я обновить MEF каталоги каталогов и пожарной события уведомив, что контейнер изменился
private void OnModulesChange(object sender, FileSystemEventArgs e)
{
_catalog.Catalogs.OfType<DirectoryCatalog>().ForEach(x => x.Refresh());
ModuleDirectoryChanged?.Invoke(this);
lastRead = DateTime.Now;
}
Каждый абонент, кроме r EADS новые модули снова через метод GetModules:
public List<IModule> GetModules()
{
var directories = _mefContainer.GetExports<IModule>().Select(x => x.Value).ToList();
directories.ForEach(x => x.RegisterModule(this));
return directories.Concat(_staticModules).ToList();
}
В методе RegisterModule я некоторые разделяющим с Unity. Это довольно много логики сейчас, но в конце концов только Родственный метод я использую есть это:
public T Resolve<T>() where T : class, IMyThing
{
return this._container.Resolve<T>();
}
Проблема
Когда GetModules вызывается в первый раз, все работает (I просто используйте dll с модулем в каталоге при запуске приложения и зарегистрируйте каталог при запуске). Я могу установить точку останова на метод Resolve и увидеть, что все зарегистрировано и объект действительно разрешен.
Но когда я копирую другую .dll в каталог, то получаю ResolutionFailedException из метода Resolve. Если я посмотрю в контейнер, я вижу тип Регистрации, как и раньше. Один и тот же контейнер используется, вызывается один и тот же метод, единственное различие заключается в том, что вызов инициируется FileSystemWatcher.
Что я делаю неправильно? Это может быть систематическая проблема, поскольку я никогда не использовал MEF и Unity вместе, и у меня есть только ограниченное знание Unity.
Извините, если описание сбивает с толку, я попытаюсь устранить любые дополнительные вопросы.
Версия
- .NET 4.5.2
- Единство 3.5 (также попытались реферированием клонировали репозиторий Единства так базовый вариант)
- МЕФ непосредственно из .NET 4.5.2 (не MEF 2)
Спасибо, это именно то, что мне нужно! –