gpt4 book ai didi

c# - 访问数据的 WCF 服务的正确设计

转载 作者:搜寻专家 更新时间:2023-10-30 20:42:06 24 4
gpt4 key购买 nike

我正在设计一个 WCF 服务来访问存储在数据库中的一些数据。

对数据库的实际访问由某个 ORM 层处理(目前是 NHibernate,但这是一个实现细节)。

我想知道这种场景的正确设计是什么?

天真的方法是这样的:

public class ServiceImplementation : IService
{
// NHibernate session
private ISession session;

// service methods that use *session*
}

这专门耦合到 NHibernate 并强制服务类管理初始化和拥有 ORM 逻辑代码。

我的问题特别是:

  • 如何实现服务与 DB/ORM 层解耦的解耦设计?
  • 何时应该初始化数据库访问/ORM层?该服务管理吗?

由于这是一个很常见的场景,我假设存在一些“模式”/最佳实践。

大多数在线可用的示例都演示了如何实现此目的(如何使用 ORM 访问数据库等),但没有说明如何从设计角度在更大范围内正确完成此操作。

最佳答案

假设您只想初始化一次,您可能需要考虑使用以下属性设置您的服务实现类:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple)]

这将导致您的服务在内存中保留一个实例,多个调用者都访问该实例。缺点是您的代码必须是线程安全的;此外,您将无法调用第二个 WCF 服务(为此,您需要可重入并发)。

但是,在这种情况下,您可以在您的服务中持有一个类实例来控制事物的 DB/ORM 端,从而实现您想要的解耦。

DB/ORM 的初始化可以在服务的构造函数中进行。

请注意,使用包含 DB/ORM 功能的静态成员变量是不明智的。这是因为即使有足够长的不活动时间,服务主机也可以回收静态值。

这当然只是实现您想要的目标的一种方法:您可能会受益于检查多重初始化与 P.I.A. 的成本。编写线程安全代码。折衷方案是使用 InstanceContextMode.PerSession - 单个用户 session 将只初始化一次 ORM,如果用户可能进行多次调用则减少初始化。定义和控制 session 的开销充其量只是一种轻微的刺激,考虑到我已经讨论了多长时间,它超出了本响应的范围。

关于c# - 访问数据的 WCF 服务的正确设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15277742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com