Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Web API“;插件";集会_C#_Asp.net_Asp.net Web Api_.net Assembly_Appdomain - Fatal编程技术网

C# .NET Web API“;插件";集会

C# .NET Web API“;插件";集会,c#,asp.net,asp.net-web-api,.net-assembly,appdomain,C#,Asp.net,Asp.net Web Api,.net Assembly,Appdomain,一次又一次地做同样的事情,期望得到不同的结果。 -精神错乱;也是我目前的心态 我有一种感觉,我只是错过了一些关键的细节,或者我在做一些愚蠢的事情(请参见tl;dr) 我有一个ASP.NETWebAPI2项目,其中我试图支持“插件”程序集。插件程序集可以/将包含其他Web API控制器和其他类型(数据提供程序、业务策略算法等)的任意组合 MyProject.Common(所有人都引用接口、合同等) MyProject.Core.Api(仅参考通用;加载组件组件) MyProject.Compo

一次又一次地做同样的事情,期望得到不同的结果。
-精神错乱;也是我目前的心态


我有一种感觉,我只是错过了一些关键的细节,或者我在做一些愚蠢的事情(请参见tl;dr

我有一个ASP.NETWebAPI2项目,其中我试图支持“插件”程序集。插件程序集可以/将包含其他Web API控制器和其他类型(数据提供程序、业务策略算法等)的任意组合

  • MyProject.Common
    (所有人都引用接口、合同等)
  • MyProject.Core.Api
    (仅参考
    通用
    ;加载
    组件
    组件)
  • MyProject.Components.One
    (也仅参考
    Common
  • MyProject.Components.Two
    (也仅参考
    Common
我正在尝试将插件程序集隔离到
plugins
目录。现在(为了测试)在构建时,我正在将组件项目的输出(
*.dll
)复制到
MyProject.Core.Api\plugins

我正在尝试在神奇的
应用程序\u Start()
方法中加载插件程序集:

var directoryName=this.Server.MapPath(“~/plugins”);
var directoryInfo=新的directoryInfo(directoryName);
var assemblySet=directoryInfo.GetFiles(“*.dll”)
.Select(fileInfo=>Assembly.LoadFrom(fileInfo.FullName))
.ToList();
现在,我在调用之前做了所有这些,考虑到默认服务是,并且考虑到所有
DefaultAssembliesResolver
所做的是:

返回AppDomain.CurrentDomain.GetAssemblys().ToList();
在任何情况下,都无法工作,无法找到控制器。


从这里开始,我开始遵循并实现了一个定制的
iasembliesresolver
;更确切地说,我是从博客文章中的
defaultassembliessolver
派生出来的

不过,当我还添加以下内容时,这才开始起作用:


而得到的是
null
§

§:也许这与多次加载程序集有关


我觉得我做错了什么,或者在错误的时间做对了

最终,我的目标是将
~/plugins
文件夹中所有该死的程序集加载到正在运行的
AppDomain
,这样就可以解析Web API控制器,并且可以使用其他组件实现

我知道您不能“卸载程序集”,而是需要卸载
AppDomain
,因此我希望,如果我需要刷新加载的程序集,我可以使用在下一个请求时强制重新加载/刷新

  • 我是否在正确的时间加载插件程序集?如果我不是,我什么时候应该
  • 我是否使用了正确的加载方法?我知道有,而且他们使用不同的加载上下文(根据示例,我使用的是
    LoadFrom()
  • 由于
    AppDomain
    共享IIS应用程序池的生存期,我还应该考虑其他事项吗?我可以强制回收/重新加载吗
  • 我到底做错了什么
tl;dr-是否没有简单的方法来管理ASP.NET中运行时加载的“插件”程序集,特别是使用Web API,以便您可以将
ApicController
类型以及其他任何内容拉入宿主应用程序?而且,强制应用程序重新加载
AppDomain
,从而重新加载所有插件程序集


  • 我试过修补,坦率地说,它很蹩脚。我知道它试图实现什么,但它强加了一些愚蠢的约束(你必须对API进行模糊处理,只是为了得到一个导出类型的列表,而不是实例),这些约束是故意嵌入的
  • 是噩梦般的,感觉就像用大炮杀死一只苍蝇。另外,我不想在每个
    AppDomain
    之间使用

看看Github上的NopCommerce repo,看看他们是如何实现插件的。谢谢@Nkosi,我会仔细看看。你熟悉那个代码库吗?如果是这样的话,
BuildManager
是否考虑了他们的方法?我学到了很多东西,看看他们是如何管理卷影副本之类的,但是如果你能详细介绍他们的任何设计选择,那将非常有帮助。我只是在上周晚些时候才发现这个回购协议,我还在审查过程中。我还没来得及全面检查插件模块,但我记得当我读到你的问题时,插件模块就在那里。我想这对你来说是一个很好的资源。太棒了,谢谢你!我会继续读下去。如果你碰巧在我之前得出任何结论,请随时发布答案。@Nkosi我不知道他们在做什么:-(有很多事情要做)。