建立了一个第三方API/SDK

问题描述:

概述建立了一个第三方API/SDK

  • 在过去的3年里,我们已经建立了一个功能齐全的软件包,在C#
  • 我们的软件是在这样一种方式,它架构处理许多应用程序所需的低级管道,以便我们的开发人员可以专注于他们试图解决的特定问题,而不是所有的细节。这显着改善了开发和发布时间
  • 因此,代码被分解为各种项目,以便为我们提供逻辑分离(例如,前端MVC应用程序,服务层,核心框架层等)
  • 我们的核心框架项目内置了很多功能(应用程序的主要“内核”),并且它已经被仔细地组织成各种熟悉的名称空间(例如数据访问,IO,日志记录,邮件等)
  • 正如我们最初构建的那样,我们的团队始终是目标受众,我们的开发人员编写各种新功能并根据需要添加到框架中。

挑战

  • 现在老板希望能够打开我们的代码库达第三方开发者和团队我们自己的公司之外。这些第三方人员需要能够直接访问我们的核心库并构建自己的模块,这些模块将与我们的服务器一起部署。只是由于应用程序的本质,它不是我们可以通过REST或SOAP或类似的方式向他们公开功能来解决的问题,他们需要在与我们自己的核心库相媲美的环境中工作,并编译他们自己的DLL版本
  • 这就引发了许多关于知识产权(我们必须能够保护我们的代码的内部工作),分发,部署,版本控制和测试和发布以及可能最重要的关注和挑战将形成框架以最好地满足这些需求。

你会提供什么建议?你会如何处理这个问题?你希望改变什么样的东西,或者你希望采用什么样的设计方法?我意识到这些问题是非常开放的,甚至可能是模糊的,但我主要从可能面临类似挑战的人的背景中寻找任何建议,资源/教程或故事。谢谢!

+2

MEF,MEF和更多MEF!为您的所有库创建'interface'并让第三方实现这些接口。然后通过MEF加载这些“插件”。 – 2013-03-18 17:46:11

+0

@HighCore - 幸运的是,幸运的是,我们已经在那里,可能是我们选择用MEF实现它的最大难题,因为增加的灵活性/可扩展性是非常可取的(该决定每天都会变得越来越好;)。挑战虽然是有很多帮助类和逻辑,我们需要提供给他们,我不知道如何最好地做到这一点,谢谢! – bruiseruser 2013-03-18 18:28:57

正如@HighCore已经说过的,为所有你想要公开的东西实现接口。将它们放入单独的项目/存储库,并为项目/存储库提供只读访问权限。但是你的界面必须有适当的记录,否则对其他人可能会很痛苦。

这样,你的代码对他们来说是不可见的,他们仍然可以在它上面工作。

如果这样做不奏效,而且您不得不向他们展示您的代码,请让他们签署NDA。 NDA应该说明你的代码是你的,他们不能以任何方式重新发布它。

我想我的答案与问题一样含糊,但给了你一些想法。

+0

感谢您的评论,我同意给出正确的答案是一个困难的问题,它实际上很难描述,而没有提供任何细节(因为我自己绑定NDA,这是棘手!)谢谢 – bruiseruser 2013-03-18 18:38:26

我不确定MEF答案是否真的解决了您的问题。即使使用Interfaces和MEF将实现与合约分离,您仍然需要提供实现(因为我理解您的问题),因此,MEF不会让您不必使用IP来交付程序集。

底线是,如果你需要分发你的实现程序集,这些第三方将拥有你的IP,并且有能力反编译它们。 .NET无法解决这个问题,最后我检查了一下。您可以使用obfuscation使其更难,但这不会阻止某人反编译您的实现,只会使其更难阅读和理解。

正如你所指出的,最好的方法是将实现放在SaaS类型的边界后面,但这听起来像是不可能的。

我要补充的是,我强烈建议开发一个强大的版本模型。这将影响您如何定义接口/ API,如何随时间改变它们,以及如何对组件进行版本化。如果您不小心,并且您的程序集中不使用AssemblyVersionAssemblyFileVersion的组合,则会强制API客户端进行不必要的重新编译,这可能是一个非常头疼的问题(即使是一些大的控制供应商也不会悲伤地处理这个权利)。 Read up on these,因为在我看来它们对API /组件供应商非常重要。

@trailmax指出,如果您认为您的用户会尊重此类协议(个人与公司可能会以不同方式查看这些类型的协议),则NDA和/或许可协议是另一种方式。

哦,还请确保你的Sign your Assemblies具有强名。要做到这一点,您可能需要制定一项策略来保护您的签名密钥。这看起来似乎很简单,但充分保护您的签名密钥并不像初看起来那么容易。您通常必须为不同的环境设置多组密钥,需要将密钥并入CI/CD系统,并且需要确保对密钥的访问权限保持严密。

+0

看到我的评论上面的HighCore。我们确实将MEF作为我们解决方案的一部分,幸运的是,我们的第三方将与该框架的主要部分进行交互。我们面临的挑战将是提供访问我们图书馆所需的各种帮助对象的途径,其中很多我们希望保持隐私和“黑盒子”。感谢您的意见,非常有帮助,如果它允许我投票给您,但它是一个新帐户 – bruiseruser 2013-03-18 18:36:49

+0

用于集合签名和文件设想的 – trailmax 2013-03-18 18:57:23

+0

+1用于SaaS。使用它和身份验证生成的代码是Web API使用的通用API。 – Fendy 2013-03-19 09:10:37