在 Silverlight 中的服务器和客户端项目之间共享类



问题:类 B 是类 A 的子类。RIA 服务返回对象 B 的列表。 类 A 和 B 都必须在服务器端定义。它们序列化得很好,我可以在主客户端项目中使用它们。

我还有另外两个库,组织为客户端库。一个用于自定义控件,另一个用于在自定义控件和实际客户端项目之间共享的类。

我需要从类库客户端访问类 A(以便自定义控件可以访问它)。我该怎么做?

我已经这样做了:

http://msdn.microsoft.com/en-us/library/ee707369%28v=vs.91%29.aspx

但 *.shared.cs 约定不会为实际客户端库以外的库提供对类 A 的访问权限。 第二种方法(添加为链接)确实执行了我希望它执行的操作,除了在服务器项目中更新 ClassA.cs 不会导致客户端版本更新,因此每次更改时都必须更新这两个类文件, 这是不可接受的

编辑:添加为链接在重试几次后效果很好。

在Visual Studio(至少2010年)中 - 不知道添加了该功能),您可以将现有项作为"链接"添加到项目中,这意味着源文件在项目之间共享。源文件仅存在一个版本。

  1. 右键单击您的项目。
  2. 点击"添加"。现有项目"。
  3. 找到所需的源文件并选择它。
  4. "添加"按钮是一个下拉菜单。单击按钮中的下拉图标。
  5. 点击"添加为链接"。

容易!

现在,对共享源文件所做的任何更改都会反映在这两个位置。当然,缺点是开发人员没有得到任何指示,表明对共享源文件的更改可能会产生比她意识到的更广泛的影响。

另一种选择是创建一个hard link,以便两个文件名引用同一个文件(Unix术语中的"inode")。在命令行上,只需念诵魔法咒语:

fsutil hardlink create <new-filename> <existing-filename>

像这样:

fsutil hardlink create c:foobarsome-projectbazbat.cs c:foobaranother-projectbazbat.cs

限制是两个名称必须位于同一卷上。

当然,这有可能混淆您的源代码管理系统。我敢打赌,TFS 没有考虑文件系统不一定是树结构的可能性,并且同一个文件可能存在于多个目录中。

硬链接文件可以按任何顺序删除:当最后一个链接被删除时,该文件将不复存在。

当然,第三种选择,也可能是"最佳实践"——讨厌这个词!——是将分片类分解成一个独立的程序集,该程序集同时部署到客户端和服务器。如果要限制浮动的程序集数量,在生成后,可以使用ilmerge来合并程序集:

  • http://www.codeproject.com/Articles/9364/Merging-NET-assemblies-using-ILMerge
  • 在运行时合并两个程序集 - C#
  • 如何将多个程序集合并为一个?

想想看,也没有理由不能将共享程序集嵌入为按需加载(甚至在启动时)加载的嵌入资源。这甚至可能比使用ilmerge更干净。具体操作方法如下:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

最新更新