如何在WPF和ASP.NET MVC应用程序之间共享最多代码?

时间:2012-03-15 17:57:27

标签: c# .net asp.net-mvc wpf

我可以使用哪些架构和模式在WPF和ASP.NET MVC应用程序之间共享大多数模型和逻辑代码?

我试图在这里实现更多,而不仅仅是将数据实体与两个演示项目分开。还有更多共同之处,例如:关于在什么条件下显示什么的UI逻辑,什么时候需要什么等等,我想保留在共享代码中。

添加:我刚刚开始真正喜欢独立于我的实体模型推动我的演示的视图模型的概念。虽然这些中使用的一些注释位于特定于MVC的程序集中,但所提供的元数据实际上都不是特定于Web的。我非常想探索使用我的MVC视图模型作为绑定到WPF视图的数据源。对此方面的任何建议都将非常感激。

7 个答案:

答案 0 :(得分:6)

我个人最喜欢的配置类似于上面提到的Adam King,但我喜欢将逻辑DLL作为Web项目的一部分。我运行一个名为CT Terminal的项目,遵循这种模式。我的Terminal.Domain项目包含所有应用程序逻辑,只返回一个CommandResult对象,其属性作为告诉UI项目执行操作的说明。用户界面非常愚蠢,只处理域项目告诉它的内容。

现在,遵循Adam King的方法,然后我将该域的DLL打成WPF应用程序,然后对UI进行编码,以遵循我返回的CommandResult对象中的指令。但是,我更喜欢不同的方法。我编写了MVC 3 UI来公开JSON API。任何应用程序都可以使用此API。 JSON API很简单,因为它基本上是我的Terminal.Domain项目CommandResult对象的包装器。返回的JSON将具有相同的基本属性。通过这种方式,我会编写WPF应用程序来使用此API而不是DLL。现在,如果我对内部应用程序逻辑进行微小更改,我只需将Web项目部署到实时服务器。使用API​​的所有客户端都会自动获得这种新逻辑。

显然,如果所做的更改会影响从API返回的属性,则需要释放新的客户端代码,但至少对于内部逻辑,您不必这样做。

答案 1 :(得分:3)

最广泛使用的模式之一似乎是将实体放在一个单独的DLL程序集中,然后从每个其他项目中引用它。

MVC 3非常适合存储库模式,这可以是第一个实例中的干净路径,并且适用于WPF和ASP.net

答案 2 :(得分:2)

我实际上发现Rocky Lhotka关于这个主题的书籍,软件和视频非常有用。以下是他的内容的一些链接:

http://www.lhotka.net/

http://channel9.msdn.com/Events/Speakers/Rockford-Lhotka

http://www.amazon.com/Expert-C-2008-Business-Objects/dp/1430210192/ref=sr_1_2?s=books&ie=UTF8&qid=1331834548&sr=1-2

答案 3 :(得分:1)

通过使用表示您需要执行的所有操作的方法指定接口,为应用程序创建服务层。此外,在此服务层中,定义应用程序使用的所有数据类型。这些数据类型类应仅包含属性,而不包含操作。将这些接口和类本身放在一个程序集中。此程序集应在您的Web应用程序,WPF应用程序和实现它的代码之间共享。

最后,一旦完成这种分离,您就可以自由地开发应用程序的内部结构,并将UI操作(例如,单击xyz按钮时发生的情况)的责任留给相应的UI。

另外,您可以通过WCF和Web服务公开您的服务层。您可以使用它通过javascript从Web浏览器拨打电话。您可以执行客户端验证等操作,甚至可以动态查找值,以获取下拉数据。在你的两个应用程序之间重复使用它。

答案 4 :(得分:1)

从明显的开始。将业务逻辑和域模型封装在单独的程序集中。

就表示层和共享UI行为而言,最接近的是MVVM设计范例,实现将是WPF / XAML中的C#和ASP.NET MVC Web前端的Javascript。

对于Web前端,您可以接近使用Microsoft的Steve Sanderson编写的http://knockoutjs.com/的WPF(MVVM)方式。它的MVVM用于浏览器。另请查看http://www.asp.net/mvc/mvc4以获取更多信息。

答案 5 :(得分:1)

使用Web Api,让WPF和Web应用程序都使用Web Api中的服务。 完成。

答案 6 :(得分:1)

您是否尝试使用Portable class libraries。有了这个,您可以创建数据层并在ASP.Net MVC,WPF,Windows Phone,Silverlight中使用它。