我正在尝试在我的应用程序中实现基本模块加载系统,我使用Unity来处理DI。我认为使用FileSystemWatcher和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;
}
每个订阅者再次通过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时,一切正常(我只是在运行应用程序时在目录中有模块的dll并在启动时注册目录)。我可以将断点放在Resolve方法中,看看所有内容都已注册,并且对象确实已经解析。
但是当我将另一个.dll复制到目录中时,我从Resolve方法获得了ResolutionFailedException。如果我查看容器,我会看到我之前所做的注册类型。使用相同的容器,调用相同的方法,唯一的区别是调用是由FileSystemWatcher启动的。
我做错了什么?这可能是一个系统性问题,因为我从未使用过MEF和Unity,而且我对Unity的了解有限。
很抱歉,如果说明令人困惑,我会尝试清除其他任何问题。
版本
答案 0 :(得分:1)
如果您想要DI和可扩展性,可以将这些库一起使用。
问题是Unity容器和MEF目录/容器彼此不了解。在NuGet上安装MefContrib.Integration.Unity,您可以使用以下代码使它们协同工作:
pyinstaller --hidden-import nbt.world script.py
在Prism应用程序中,您希望在// Setup
var unityContainer = new UnityContainer();
var aggregateCatalog = new AggregateCatalog();
// Register catalog
unityContainer.RegisterCatalog(aggregateCatalog);
替换Bootstrapper
中执行此操作。或者MEF无法解决Prism为Unity提供的很多内容,例如CreateContainer
,IUnityContainer
或IEventAggregator
。
答案 1 :(得分:0)
为什么同时使用这两个框架? Unity和MEF都是依赖注入管理器 框架只是以不同的方式实施,因而带来了优势和劣势。
我希望以下链接可以帮助您: