团结和MEF合作

时间:2015-09-03 06:06:39

标签: c# unity-container mef

我正在尝试在我的应用程序中实现基本模块加载系统,我使用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的了解有限。

很抱歉,如果说明令人困惑,我会尝试清除其他任何问题。

版本

  • .NET 4.5.2
  • Unity 3.5(也尝试引用克隆的Unity存储库以便基线版本)
  • MEF直接来自.NET 4.5.2(不是MEF 2)

2 个答案:

答案 0 :(得分:1)

如果您想要DI和可扩展性,可以将这些库一起使用。

问题是Unity容器和MEF目录/容器彼此不了解。在NuGet上安装MefContrib.Integration.Unity,您可以使用以下代码使它们协同工作:

pyinstaller --hidden-import nbt.world script.py

Read More...

在Prism应用程序中,您希望在// Setup var unityContainer = new UnityContainer(); var aggregateCatalog = new AggregateCatalog(); // Register catalog unityContainer.RegisterCatalog(aggregateCatalog); 替换Bootstrapper中执行此操作。或者MEF无法解决Prism为Unity提供的很多内容,例如CreateContainerIUnityContainerIEventAggregator

答案 1 :(得分:0)

为什么同时使用这两个框架? Unity和MEF都是依赖注入管理器 框架只是以不同的方式实施,因而带来了优势和劣势。

我希望以下链接可以帮助您: