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

时间:2012-08-10 16:22:08

标签: c# visual-studio-2010 silverlight shared-libraries

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

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

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

我做到了这一点:

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

但* .shared.cs约定不提供除实际客户端库以外的库访问A类。第二种方法(Add as Link)确实做了我想要它做的事情,除了更新服务器项目中的ClassA.cs不会导致客户端版本更新,因此每次更改时都需要更新两个类文件,这是不可接受的

编辑:添加,因为链接在多次尝试后效果很好。

1 个答案:

答案 0 :(得分:1)

在Visual Studio(2010年,至少 - 完全没有添加功能)中,您可以将现有项目作为“链接”添加到项目中,这意味着源文件在项目之间共享。只存在一个源文件版本。

  1. 右键单击您的项目。
  2. 点击“添加...现有项目”。
  3. 找到所选的源文件并选择它。
  4. “添加”按钮是一个下拉列表。单击按钮中的下拉图标。
  5. 点击“添加为链接”。
  6. 容易!

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

    另一种选择是创建hard link,因此两个文件名引用相同的文件(Unix术语中的'inode')。在命令行上,只需唱出神奇的咒语:

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

    类似的东西:

    fsutil hardlink create c:\foo\bar\some-project\bazbat.cs c:\foo\bar\another-project\bazbat.cs
    

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

    这有可能使您的源控制系统混乱。我愿意打赌TFS没有考虑文件系统不一定是树结构的可能性,并且同一个文件可能存在于多个目录中。

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

    第三种选择,当然,也许是“最佳实践” - 讨厌那个词! - 将分片类分解为一个独立的程序集,该程序集部署到客户端和服务器。如果想限制在构建后浮动的程序集数量,可以使用ilmerge合并程序集:

    考虑到这一点,也没有理由不能将共享程序集嵌入到按需加载(甚至在启动时)加载的嵌入式资源。这可能比使用ilmerge更清晰。以下是如何做到这一点:

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