【问题标题】:Add Web API Controller to different assembly将 Web API 控制器添加到不同的程序集
【发布时间】:2014-05-23 00:54:57
【问题描述】:

如何将 Web Api 控制器添加到不同的程序集? 我想将 Web API 控制器从我的 MVC 应用程序中分离出来。

【问题讨论】:

    标签: c# .net asp.net-mvc-4 asp.net-web-api


    【解决方案1】:
    • 在您的解决方案中创建一个新的类库项目并添加新的 从 ApiController 继承的类。
    • 您可能需要为新项目添加一些额外的引用,因为默认情况下不包含所有 mvc 库。
    • 在您的 mvc 项目中,添加对包含您的 api 控制器的新类库项目的引用
    • 构建和测试

    【讨论】:

    • 从 web 项目中清除 bin 文件夹,然后重建解决方案
    【解决方案2】:

    WebApi 开箱即用。

    DefaultAssembliesResolver 类是用于加载程序集以查找 ApiController 的类。以下是源代码:

      public class DefaultAssembliesResolver : IAssembliesResolver {    
        public virtual ICollection<Assembly> GetAssemblies() {
          return AppDomain.CurrentDomain.GetAssemblies().ToList();
        }
      }
    

    诀窍是在第一次调用 web.api 服务之前将程序集加载到 AppDomain。

    在目标程序集中调用类的任何方法或直接从其中加载类型。例如:

    var x = typeof (YourApiControllerInAnotherAssembly);
    

    如果您使用的是旧版本的 WebApi,请尝试实现 IAssembliesResolver 并更改它的默认实现,如下所示:

    GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), 
                                                       new YourCustomAssemblyResolver());
    

    【讨论】:

    • 我也遇到了同样的问题。 “调用目标程序集中类的任何方法或简单地从中加载类型”是什么意思。我想这就是让我着迷的原因。
    • 作为一种解决方法,我必须创建一个从我的 api 控制器继承的虚拟类。命名空间是目标库,但虚拟类与我的 api 控制器一起驻留在单独的库中。哈克但确实有效。
    • @TruMan1 您可以做的一件事就是按照我上面展示的方式实现和注册您的 IAssembliesResolver 并在 GetAssemblies 方法处设置一个断点。运行应用程序,当调试器停止时,检查 GetAssemblies 方法是否也返回带有控制器的程序集。
    猜你喜欢
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多