从主 ASP .NET 应用程序中拆分 Web API 控制器
Split Web API controllers out from main ASP .NET application
我有一个用 Web 窗体和 VB .NET 编写的遗留应用程序。我受够了这种组合,所以我试图在 Web API 控制器而不是 ashx 处理程序中编写新功能。对我好。我也更喜欢 C#,所以我试图从 C# 库加载我的控制器操作,而不是将它们写入 VB .NET.
我已尝试执行以下操作:
- 使用 MapRoute 命名一个程序集来加载(不能这样做,只能看到 MapHttpRoute,MapRoute 不可用。MapHttpRoute 没有程序集选项)
- 编写我自己的程序集解析器以在运行时加载我的其他项目 DLL。这也不起作用,VB NET 抱怨我使用的代码没有正确实现 GetAssemblies。
这是我正在尝试使用的代码:
Public Class CustomAssemblyResolver
Inherits IAssembliesResolver
Public Function IAssembliesResolver_GetAssemblies() As ICollection(Of Assembly) Implements IAssembliesResolver.GetAssemblies
Dim baseAssemblies As List(Of Assembly) = AppDomain.CurrentDomain.GetAssemblies().ToList()
Dim controllersAssembly = Assembly.LoadFrom("APIControllers.dll")
baseAssemblies.Add(controllersAssembly)
Return baseAssemblies
'Throw New NotImplementedException
End Function
End Class
我得到的错误是 "Interface IAssembliesResolver is not implemented by this class"。
从单独的项目加载我的 API 控制器的最简单方法是什么?主项目是VB.NET,我加载的项目是C#。
编辑:目前的布局使问题复杂化。为简单起见,oldyuck 是 web forms/vb .net 东西,newfast 是新的 C# 项目。
oldyuck 是主要的遗留项目。它有一个巨大的整体class,可以做任何事情。这被实例化为一个可以做任何事情的巨大对象。它也是 Web Forms/VB .NET 的讽刺。
newfast 是我的 C# API 控制器项目。它需要来自 oldyuck 的巨大单体对象来对数据库等做任何事情
newfast 可以依赖 oldyuck,然后我可以依赖这个巨大的对象,并实例化它等等,但是当 oldyuck 构建时它不会在 /bin/ 文件夹中结束。
oldyuck 可以依赖newfast,然后它最终会在/bin/ 文件夹中。但是在这个设置中,newfast 不能依赖于 oldyuck 的 god 对象,所以它不能使用任何代码,而且似乎没有办法将那个对象传递给它。
我卡住了。帮助:(
虽然可能可能在 Web 窗体应用程序中使用 C# Web Api 代码,反之亦然,但它可能难以维护或难以维护了解任何追随您的开发人员。我建议将其分解为两个单独的应用程序。
当谈到重构单体应用和在多个框架或范例中使用代码库时,没有正确或错误的答案,但我认为考虑是否要共享 代码 或 州.
共享代码相对简单,将 oldyuck 引用为 newfast 的项目依赖项应该没有问题,然后就可以了。更新您的构建和部署过程以使用 2 个应用程序,并调用 newfast,可能通过 jQuery 直接从客户端调用。
共享状态可能要困难得多。如果你的大神class在ASP.NETSession中维护了很多state,那你就需要想办法共享了。查看 this question 以了解一些可能的解决方案。然而,强制持久化数据库并传递密钥以访问数据可能更简单。
我不确定我是否理解正确,但对我来说它看起来就像一个参考问题。如果是这种情况,可以通过创建第三个项目轻松解决,比如包含上帝 class.
的 GodClassLibrary
上帝 class 然后从 Oldyuck 中删除,Oldyuck 获得对 GodClassLibrary 的引用。
并且 NewFast 还获得了对 GodClassLibrary 的引用。
现在编译后,两者在各自的 bin 文件夹中都有 GodClassLibrary 的副本,并且可以使用遗留代码。
我有一个用 Web 窗体和 VB .NET 编写的遗留应用程序。我受够了这种组合,所以我试图在 Web API 控制器而不是 ashx 处理程序中编写新功能。对我好。我也更喜欢 C#,所以我试图从 C# 库加载我的控制器操作,而不是将它们写入 VB .NET.
我已尝试执行以下操作:
- 使用 MapRoute 命名一个程序集来加载(不能这样做,只能看到 MapHttpRoute,MapRoute 不可用。MapHttpRoute 没有程序集选项)
- 编写我自己的程序集解析器以在运行时加载我的其他项目 DLL。这也不起作用,VB NET 抱怨我使用的代码没有正确实现 GetAssemblies。
这是我正在尝试使用的代码:
Public Class CustomAssemblyResolver
Inherits IAssembliesResolver
Public Function IAssembliesResolver_GetAssemblies() As ICollection(Of Assembly) Implements IAssembliesResolver.GetAssemblies
Dim baseAssemblies As List(Of Assembly) = AppDomain.CurrentDomain.GetAssemblies().ToList()
Dim controllersAssembly = Assembly.LoadFrom("APIControllers.dll")
baseAssemblies.Add(controllersAssembly)
Return baseAssemblies
'Throw New NotImplementedException
End Function
End Class
我得到的错误是 "Interface IAssembliesResolver is not implemented by this class"。
从单独的项目加载我的 API 控制器的最简单方法是什么?主项目是VB.NET,我加载的项目是C#。
编辑:目前的布局使问题复杂化。为简单起见,oldyuck 是 web forms/vb .net 东西,newfast 是新的 C# 项目。
oldyuck 是主要的遗留项目。它有一个巨大的整体class,可以做任何事情。这被实例化为一个可以做任何事情的巨大对象。它也是 Web Forms/VB .NET 的讽刺。 newfast 是我的 C# API 控制器项目。它需要来自 oldyuck 的巨大单体对象来对数据库等做任何事情
newfast 可以依赖 oldyuck,然后我可以依赖这个巨大的对象,并实例化它等等,但是当 oldyuck 构建时它不会在 /bin/ 文件夹中结束。
oldyuck 可以依赖newfast,然后它最终会在/bin/ 文件夹中。但是在这个设置中,newfast 不能依赖于 oldyuck 的 god 对象,所以它不能使用任何代码,而且似乎没有办法将那个对象传递给它。
我卡住了。帮助:(
虽然可能可能在 Web 窗体应用程序中使用 C# Web Api 代码,反之亦然,但它可能难以维护或难以维护了解任何追随您的开发人员。我建议将其分解为两个单独的应用程序。
当谈到重构单体应用和在多个框架或范例中使用代码库时,没有正确或错误的答案,但我认为考虑是否要共享 代码 或 州.
共享代码相对简单,将 oldyuck 引用为 newfast 的项目依赖项应该没有问题,然后就可以了。更新您的构建和部署过程以使用 2 个应用程序,并调用 newfast,可能通过 jQuery 直接从客户端调用。
共享状态可能要困难得多。如果你的大神class在ASP.NETSession中维护了很多state,那你就需要想办法共享了。查看 this question 以了解一些可能的解决方案。然而,强制持久化数据库并传递密钥以访问数据可能更简单。
我不确定我是否理解正确,但对我来说它看起来就像一个参考问题。如果是这种情况,可以通过创建第三个项目轻松解决,比如包含上帝 class.
的 GodClassLibrary上帝 class 然后从 Oldyuck 中删除,Oldyuck 获得对 GodClassLibrary 的引用。
并且 NewFast 还获得了对 GodClassLibrary 的引用。
现在编译后,两者在各自的 bin 文件夹中都有 GodClassLibrary 的副本,并且可以使用遗留代码。