如何在两个Silverlight客户端应用程序中重用用户控件?

时间:2014-10-24 21:16:43

标签: c# web-services silverlight code-reuse

我是Silverlight的新手,我有一个解决方案,它有一个提供远程服务的Web项目(webApp)和两个使用这些服务的客户端应用程序(client-1和client-2)。

我在client-1中创建了一个复杂的用户控件,用于查看/编辑从webApp检索到的对象,我想在client-2中重用此控件。

问题是,当您从客户端应用程序引用服务时,类型是"本地类型"。例如,webApp中定义的MyClass在client-1应用程序中变为client-1.MyClass。在client-2应用程序中使用完全相同的对象(引用),它现在是client-2.MyClass类型

如果我创建一个库来托管我的控件,我将不得不添加对Web服务的引用,我将有第三种类型lib.MyClass。我们都知道client-1.MyClass,client-2.MyClass和lib.MyClass都是从web.MyClass生成的完全相同的类,但是我找不到解决这个问题的方法。

我目前正在寻找在每个客户端应用程序中共享用户控件的源代码,并在每个项目中定义预处理器,以便我可以在我的用户控制代码文件中执行此操作:

#if CLIENT-1
using Client-1.WebAppServiceReference
#end if

#if CLIENT-2
using Client-2.WebAppServiceReference
#end if

然后使用MyClass类型的方法正在使用正确的" local-type"在每个客户端应用程序但是我遇到了问题,因为xaml中没有预处理器功能,并且在那里引用了应用程序的命名空间,我需要有条件。

在Silverlight项目中,有一种更简单的方法可以重新使用控件,不是吗?我无法在每个项目中为这个控件创建两个源文件副本!!

谢谢!

2 个答案:

答案 0 :(得分:0)

有两个选项允许您在Silverlight项目/ WCF服务代理中使用共享实体类。

  1. 使用RIA类库
  2. 使用便携式类库
  3. 如果使用上述任一方法创建DataContract类,然后从WCF和Silverlight客户端项目引用库,则自动生成的代码将使用对这些共享类的引用(而不是本地自动引用)生成的类)。这应该允许您在项目之间重用Silverlight UserControl。

    两种方法的区别在于此。如果你使用第一种方法(RIA项目),那么当你创建名为" SomeEntityClass.shared.cs"的文件时," .shared"告诉Visual Studio将该文件的副本放在镜像Silverlight项目中。第二种方法(PCL)是一种更新的方法 - 它允许您创建能够针对多个平台(.Net,Silverlight,Windows Phone,...)的类库,以及一组减少的核心.NET库。

答案 1 :(得分:0)

我建议你将XAML和图形内容从任何商业逻辑等中分离出来。 MVVM是一个非常好的模式。 之后,您可以使用Visual Studio的非常有用的功能从第二个项目引用您的UserControl" Add as Link" 在这里你可以这样做:

Add as Link

对于基础业务,您可以将其用于两个项目,并将这两个项目与之链接。

希望有所帮助