用于业务实体和业务逻辑的多租户服务API

时间:2010-01-22 03:00:53

标签: wcf

我们有一个应用程序,我们希望公开大量的数据库实体和一些业务逻辑。每个实体都需要具有读取,添加和更新的功能。此时我们不希望允许删除。

我们构建的软件用于广泛的业务,因此是多租户运营局服务,我们的一些客户也出于财务原因使用这种方法来建立单独的数据库。

我们希望能够最大限度地减少需要维护的端点数量。目前只有3个表作为WCF接口公开,每个接口有6个附加方法。这是可管理的,但如果操作有50个数据库突然变成150个端点。如果我们有50个暴露的表变为2500个端点,那就更糟了。

有没有人建议如何设计我们仍然有Job.add(var1)或iList jobs = Job.GetSelected(“sql type read”)的简单实体模型的系统。

没有所有这些端点

5 个答案:

答案 0 :(得分:1)

WCF Data Services允许您使用Open Data协议(OData)以RESTful方式公开您的数据。这被正式称为ADO.Net数据服务,之前是Astoria。可以公开任何IQueryable集合。大多数示例中显示的方式是使用实体框架,但是有一些示例显示了NHibernate和其他数据访问技术的用法。 OData是一个基于Atom-Pub的自描述API,带有一些自定义扩展。使用最少量的代码,您可以以明确定义的格式公开整个数据库。这很容易。

为了实现多任务,您可以在WCF数据服务应用程序中创建查询拦截器以实现该逻辑。拦截器的数量和您编写的代码的复杂性将取决于您的安全模型和要求。查看类似T4模板或CodeSmith的东西来生成基于数据库模式的拦截器方法可能是一种防止大量重复手动编码的方法。

我提供的链接有很多关于WCF数据服务的信息和教程,并提供了一个开始查看它是否能满足您需求的好地方。我一直在寻找类似问题的WCF数据服务(多租户),并且很想听听你如何实际解决问题。

答案 1 :(得分:0)

似乎您可以将“身份”传递给每个查询并将其考虑在内。这意味着“作业”表中的每条记录都需要引用所有者“身份”,但这不应该是一个大问题。

只需确保每个查询都验证“身份”,您应该没问题。

答案 2 :(得分:0)

如果我正确理解您的问题,我认为您需要唯一的终端,但您可以使用您的终点引用的单一服务行为。

创建默认端点:

<behaviors>
  <serviceBehaviors>
    <behavior name="MyService.DefaultBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

设置默认绑定:

<bindings>
  <wsHttpBinding>

    <binding name="DefaultBinding">
      <security mode="None">
        <transport clientCredentialType="None"/>
      </security>
    </binding>

  </wsHttpBinding>
</bindings>

让所有服务引用指向默认行为和绑定:

<service behaviorConfiguration="MyService.DefaultBehavior"
           name="MyService.Customer">
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="DefaultBinding"
              contract="MyService.ICustomer">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>

每次添加服务时,都是一个简单的配置条目。

答案 3 :(得分:0)

提供多租户,没有多亿个终点

一种方法是使用 REST风格的WCF服务,它可以使用用户名/密码来区分您正在使用的客户端,从而能够在内部选择要连接的数据库。 WCF为您提供了 UriTemplate ,它允许您将URL的部分映射到Web方法中的参数:

您还可以添加其他Uri模板以执行更多任务,例如:

谁在使用我的服务?

要求客户提供用户名和密码,您可以将其映射到特定的数据库。通过使用 / {tableName} / {operation} / {params ...} 的UriTemplate,您可以使用Web服务中的代码执行给定表,操作和参数的DB过程

结束

您的网络配置甚至不需要改变太多。以下网络文章系列是了解REST风格的Web服务的好地方,我相信这些服务符合您的需求:http://www.robbagby.com/rest/rest-in-wcf-blog-series-index/

答案 4 :(得分:0)

使用Apache,您可以使用一组相当简单的URL重写规则,将任意一组DB表及其对应的端点映射到带有参数的单个端点。

例如,要将$ ROOT / table_name / column_name映射到$ ROOT / index.php?tn = table_name&amp; cn = column_name,您可以将这样的规则添加到$ ROOT / .htaccess:

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/?$ index.php?tn=$1&cn=$2 [QSA,L]

然后你只需要维护$ ROOT / index.php(这当然可以为不存在的表和/或列生成适当的HTTP状态代码)。