Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 向编译代码添加新类型(将其视为数据)_C#_.net_Architecture - Fatal编程技术网

C# 向编译代码添加新类型(将其视为数据)

C# 向编译代码添加新类型(将其视为数据),c#,.net,architecture,C#,.net,Architecture,这个问题完全是关于需要重建的现有系统的低效架构。它要求具有管理此类笨拙系统经验的开发人员进行验证。我已经尽我所能在下面把它抽象出来了 该应用程序满足了非常复杂的需求,并且提供了非常好的性能。问题在于,内部管道使代码管理和可伸缩性成为一场噩梦。我能分享的关于上下文的一点信息包括,我们需要将代码视为数据商品。换言之,只有在不断地向系统中添加实现的类时,系统才能正常工作 应用程序交付给最终用户的不是数据,而是需要代码执行上下文的[Action]。因此,应用程序必须在目标系统上执行一些代码,以交付用户期

这个问题完全是关于需要重建的现有系统的低效架构。它要求具有管理此类笨拙系统经验的开发人员进行验证。我已经尽我所能在下面把它抽象出来了

该应用程序满足了非常复杂的需求,并且提供了非常好的性能。问题在于,内部管道使代码管理和可伸缩性成为一场噩梦。我能分享的关于上下文的一点信息包括,我们需要将代码视为数据商品。换言之,只有在不断地向系统中添加实现的类时,系统才能正常工作

应用程序交付给最终用户的不是数据,而是需要代码执行上下文的
[Action]
。因此,应用程序必须在目标系统上执行一些代码,以交付用户期望的内容。现在这些期望在编译时是未知的,几乎每天都需要添加新的期望。这意味着,开发人员会定期向系统添加
[Actions]

现有系统静态链接到这些
[Action]
类!这不仅使代码管理成为一场噩梦,而且每次添加操作时都需要重新编译

我的第一反应是让系统在运行时动态链接到程序集,其中每个程序集将包含一系列操作。这类似于向应用程序添加可扩展性功能。我考虑过MEF框架,但感觉不太对劲

我能想到的唯一替代方法是将每个操作作为源代码或编译模块存储在数据库中。每种方法都有自己的优缺点,比如存储源代码不太安全,但让我可以更好地控制代码审查和持续维护。按编译方式存储具有服务器端程序集签名的优点


对于如何构建这样一个系统,我希望您能提供一些建议。

我认为您不需要更灵活的体系结构,而是需要更灵活的软件流程。每天添加新功能是大多数开发人员的工作。对于插件系统来说,这不是一个有效的参数

你不需要插件架构。您需要良好的软件开发方法,如敏捷过程(如Scrum和XP),并确保能够做到这一点:

  • 让开发人员在分支中构建新组件
  • 彻底测试后,将新功能合并到主分支
  • 通过这种方式,主分支始终具有生产质量,您可以每天使用持续集成和持续交付来推出新版本

    • 我认为您不需要更灵活的体系结构,而是需要更灵活的软件流程。每天添加新功能是大多数开发人员的工作。对于插件系统来说,这不是一个有效的参数

      你不需要插件架构。您需要良好的软件开发方法,如敏捷过程(如Scrum和XP),并确保能够做到这一点:

      • 让开发人员在分支中构建新组件
      • 彻底测试后,将新功能合并到主分支
      • 通过这种方式,主分支始终具有生产质量,您可以每天使用持续集成和持续交付来推出新版本

      另一种选择是使用dlr,因此可以用ruby或python编写“操作”。很多有趣的东西,比如动态构建、缓存。反射。在没有所有反射的情况下发射scaffolding@TonyHopkinson:我考虑过这一点,但对客户端编译感到不舒服。无论我们存储为源代码还是已编译,客户端都将始终获得已编译版本。如果要将程序集放在db中,则这将是客户端编译,并通过URL获取它们,或者执行某种自动更新机制,这样我就看不出不适来自何处。@TonyHopkinson:不适来自这样一个事实:通过服务器编译,我们可以拥有服务器端强签名程序集。是的,这仍然意味着客户端动态链接,但不是没有验证。嗯,使用证书部署它们可以解决这一问题。另一个选择是使用dlr,因此可以用ruby或python编写“操作”。很多有趣的东西,比如动态构建、缓存。反射。在没有所有反射的情况下发射scaffolding@TonyHopkinson:我考虑过这一点,但对客户端编译感到不舒服。无论我们存储为源代码还是已编译,客户端都将始终获得已编译版本。如果要将程序集放在db中,则这将是客户端编译,并通过URL获取它们,或者执行某种自动更新机制,这样我就看不出不适来自何处。@TonyHopkinson:不适来自这样一个事实:通过服务器编译,我们可以拥有服务器端强签名程序集。是的,这仍然意味着客户端动态链接,但不是没有验证。嗯,用证书部署它们会解决这个问题。我可能没有充分解释上下文。考虑订阅的SaaS软件。它允许您下载桌面应用程序。您向服务请求一项新功能,当该功能可用时,应用程序会自动下载并执行该功能。它就像一个按需可执行交付平台。这与将
      [功能]
      添加到现有应用程序非常不同。此应用程序除了向用户计算机提供可执行的有效载荷外,没有其他功能。我可能没有充分解释上下文。考虑订阅的SaaS软件。它允许您下载桌面应用程序。您向服务请求一项新功能,当该功能可用时,应用程序会自动下载并执行该功能。它就像一个按需执行的程序