C#WCF存储库

时间:2016-04-13 14:36:11

标签: c# wcf

我的数据层中有几个对数据库执行CRUD操作的REPOSITORY类。我不确定这个设计,因为大多数表都需要每个存储库一个专用的类,过了一段时间我会为数据库中存在的每个表最终获得大量的存储。我这样做是因为,当然,我还在学习C#,因为我在Web上看到的每个样本都需要一个专用的每个表的存储器,所以...我做了同样的... (如果存在更好的选择,请告诉我们)

无论如何,我也在学习WCF,从我到目前为止看来,实现设计有点类似于DataLayer中的存储库。 在WCF中,我有一个Interface ServiceContract,由另一个暴露这些操作的Class实现。

这是我对此的困惑,WCF ProxyClient将使用ServiceContract中定义的操作来执行对DB的调用,但由于我想将相同的CRUD操作公开给远程WCF客户端,我应该创建一个类每个表,就像我在数据层存储中一样?

从几个在线看到的例子中,WCF ServiceContract更有可能用于特定的操作,比如GetSomething by ID,performThis或That ......但这些操作更有可能由表示层和业务层执行...如果我使用WCF在业务层和数据层之间进行通信,我是否应该将WCF服务中的CRUD操作公开给代理客户端?

对不起长篇描述我很抱歉,但我的头脑在旋转...... 也许在你的帮助下,我可以理解所有这一切......

2 个答案:

答案 0 :(得分:2)

首先,您必须在WCF中将其视为暴露某些业务逻辑的框架(来自msdn):

  

服务操作使您能够在数据服务中公开业务逻辑

然后,当你说:

  

如果我使用WCF在业务层和数据层之间进行通信

在大多数情况下,这没有多大意义,最好的方法是: 服务层(WCF)>业务层>数据访问层。

这是msdn的一个很好的例子:

enter image description here

因为你必须考虑你真正希望揭示的“内容”,你的代码必须遵循这个想法。因此,例如,您有一个名为“Client”的存储库,它有几种CRUD方法,还有一些与“Client”相关的存储库,如“ClientType”和“ClientExtraData”。

您的服务不需要具有相同的结构,您可以将所有内容封装在“ClientService”中,其中包含一些操作,如“GetClient”,“GetFullClient”,它返回Client和ClientExtraData,依此类推。这只是一个澄清我的意思的例子。

与MVC相同的方法,您的用户界面模型与您的存储库中的模型不同。

创建服务模型并在服务中使用请求和响应模式。 您可以在此处详细了解:http://www.servicedesignpatterns.com/requestandresponsemanagement/datatransferobject

在这里:https://msdn.microsoft.com/en-us/library/ee658090.aspx

希望这可以帮助您设计和编写服务层。

答案 1 :(得分:0)

如果您使用azure表存储作为表,则可以使用具有类型约束的单个通用存储库来实现ITableEntity接口。

然后,您的存储库可以在内部将输入实体转换为DynamicTableEntity,并将其写入azure表存储。您可以根据实体类型或自定义实体属性(如域名等)来决定实体需要写入哪个表。

对于WCF服务合同,它稍微复杂一些。 WCF支持继承的序列化。您可以让ServiceContract在其操作合同中将公共基类作为参数和/或返回值。然后,您需要明确地通过WCF服务契约中的KnownTypeAttribute定义实际的子类(实体类),以便您可以使用它来回传递您的实体。

这样,您的体系结构将具有多个实体类型和公共WCF ServiceContract的公共存储库。