.NET和Silverlight之间共享代码的可行性?

时间:2010-01-10 21:54:15

标签: c# .net silverlight sharing

刚刚经历了一个小型实验会议,试图了解将我们的.NET类库或至少部分内容库带入Silverlight所需的工作量,以便我们可以在两个世界之间重用业务逻辑,我想知道其他人是否有这方面的经验。

我注意到的事情,从头顶开始:

  • 缺少很多属性(例如,可浏览(假))
  • 许多接口丢失或存在但空(ICloneable隐藏,缺少ITypedList)
  • 反思差异(一切都可以公开)
  • 一些基类差异(没有组件?)

所以我想知道,我甚至认为这是可行的吗?

我运行了初始代码,但我不得不注释掉很多基本功能,主要是处理列表,因为它们基于ITypedList和一些基类。显然我需要在Silverlight中更改为ObservableCollection,因此需要更改整个基本代码才能应对。

我创建的实际业务测试类与我为.NET制作的实际业务测试类相同,只有一些微小的更改,这些更改很容易在.NET中使用,就像我没有做过的那样在看Silverlight之前。换句话说,如果我可以使基类兼容,那么共享业务逻辑看起来是可行的。

就这样我很清楚,我所说的是我基本上会有两个项目文件,一个用于.NET,一个用于Silverlight,但实际的C#源代码是相同的,在2。

那么有没有人有这方面的经验?任何提示或指南?

值得吗?它肯定值得更多关注。

4 个答案:

答案 0 :(得分:4)

这绝对可行。

这是在一个项目上完成的; Silverlight项目包含C#,并且有一些#IF语句处理一些事情(比如log4net声明),有时候事情只是重新实现。但总的来说,这是一个巨大的胜利,你一定要尝试它(当然,我们已经成功)。

- 编辑:

但有一点,我们的OR / M(LLBLGen)没有内置支持通过Silverlight发送的“简单”对象;但有人写了一个处理它的插件,这有帮助。所以可能值得考虑一下你正在使用什么类型的DAL,以及它支持Silverlight的程度。

答案 1 :(得分:4)

我为促进这一点所做的是:

  1. 经常使用部分类和#if!SILVERLIGHT将代码分成Silverlight可以处理的部分。
  2. 尽可能使用代码生成。例如,我一直在尝试生成Silverlight等效属性的T4模板(例如DisplayAttribute而不是DescriptionAttribute)
  3. 每当有一个未由Silverlight实现的接口/属性(例如IDeserializationCallback,ICloneable,INotifyPropertyChanging)时,我将在Silverlight应用程序中创建一个同名的虚拟接口,只要我知道实现的事实不会被使用不是问题。
  4. 最后,值得注意的是,在Silverlight 4中,只要没有Silverlight不支持的依赖项,汇编格式就允许在Silverlight和.NET之间共享二进制文件。
  5. 关于单独的基类的另一个注意事项 - 创建一个派生自Silverlight和BindingList中的ObservableCollection(或者您在.NET中使用的任何内容)的抽象类可能是值得的,以最小化对您的类型集合的影响。 / p>

    <强>更新 今天我正在努力将一些.NET代码移植到Silverlight,这些代码大量使用System.Diagnostics API,如TraceSource,SourceSwitch等,它们在Silverlight中不存在。我在Silverlight项目中创建了非常小的实现,并将它们放在Einstein.Diagnostics命名空间中。在这样做时,我决定我需要一个约定来轻松识别模仿.NET Framework与我自己的代码的代码。所以我将占位符文件重命名为带@符号的前缀。我也在这些文件中加上了类名称的前缀。关于这一点的好处是,就C#编译器而言,@符号实际上并没有改变它们的类名。所以@SourceSwitch仍然可以编译为Einstein.Diagnostics.SourceSwitch,但在代码中我可以很容易地看到有些东西在上升。我还用[SilverlightPlaceholder]属性装饰了这些类。

答案 2 :(得分:2)

我用protobuf-net做这个,我用了几种方法:

  • 项目文件中的条件编译符号触发细微的代码分支(是的,它不完美,但它有效)
  • 重新介绍一些东西;属性可能就是一个例子 - 你的代码仍然可以使用重新引入的属性,即使框架代码没有;作为一个更极端的例子,对于紧凑的框架,我不得不重新引入一大块Expression API,这很有趣
  • 只是放下一些东西;-p

然而如果您正在使用ITypedList(您提及),我可以看到整个方法相当混乱;组件模型已经足够复杂,而且不必强行通过黑客攻击。这真的取决于你走多远这条路。也许4.0 / dynamic会再次打开其中一些选项?

答案 3 :(得分:2)

您的问题的一个可能的解决方法是从Mono项目中复制丢失的代码。在当天,我使用Compact Framework完成了一个小项目,它缺少整个System.XLM命名空间。我只是将Mono中的所有内容复制到我的项目中,编译它并且只需很少的更改即可完成,iirc。