Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中如何在运行时更改持久层#_C#_Design Patterns_Persistence - Fatal编程技术网

C# 在C语言中如何在运行时更改持久层#

C# 在C语言中如何在运行时更改持久层#,c#,design-patterns,persistence,C#,Design Patterns,Persistence,我正在着手一个新项目,需要资深架构师/设计模式大师的指导 我的新项目需要有许多持久层,客户机可以通过这些持久层在运行时决定数据存储的位置,例如,内部SQL数据库、MS Exchange或Google存储 功能基本相同,只是每个功能的存储/实现不同 我在这里不想看到的是你是如何做到这一点的,只是一个指向最佳模式的指针,以达到我的目的,同时仍然提供了灵活性,因为它们将发生变化。我试图避免具体的实现,这将不可避免地导致一些讨厌的代码气味 我知道这将涉及到某种形式的DI,但这里的任何提示都将不胜感激 您

我正在着手一个新项目,需要资深架构师/设计模式大师的指导

我的新项目需要有许多持久层,客户机可以通过这些持久层在运行时决定数据存储的位置,例如,内部SQL数据库、MS Exchange或Google存储

功能基本相同,只是每个功能的存储/实现不同

我在这里不想看到的是你是如何做到这一点的,只是一个指向最佳模式的指针,以达到我的目的,同时仍然提供了灵活性,因为它们将发生变化。我试图避免具体的实现,这将不可避免地导致一些讨厌的代码气味


我知道这将涉及到某种形式的DI,但这里的任何提示都将不胜感激

您的案例实际上没有什么特别之处,因此如果您遵循DI的标准实践,并使用容器来简化您的任务,如
SimpleInjector
,就可以了。对于您来说,主要的一点应该是不依赖于具体的类,而是依赖于抽象,这就是DI容器将帮助您组织的地方


例如,如果您计划保存用户,您可能会有一些
IUserRepository
方法
SaveUser
。然后,您将实现
SqlUserRepository
GoogleStorageRepository
,等等。任何其他数据访问层接口也是如此。如果您只是这样做,那么您将需要以一种方式配置您的DI,以便您可以根据需要在运行时提供所需的存储库。不要忘记永远不要直接依赖于
谷歌存储库
,而只能依赖于一个公共界面。我将为接口创建一个项目(以及DL将知道的相应BI数据模型),并为每个实现创建一个项目,以便将其进一步分离。

您的案例没有什么特别之处,因此,如果您遵循DI的标准实践,并使用容器来简化您的任务,如
SimpleInjector
,那么就可以做到这一点。对于您来说,主要的一点应该是不依赖于具体的类,而是依赖于抽象,这就是DI容器将帮助您组织的地方


例如,如果您计划保存用户,您可能会有一些
IUserRepository
方法
SaveUser
。然后,您将实现
SqlUserRepository
GoogleStorageRepository
,等等。任何其他数据访问层接口也是如此。如果您只是这样做,那么您将需要以一种方式配置您的DI,以便您可以根据需要在运行时提供所需的存储库。不要忘记永远不要直接依赖于
谷歌存储库
,而只能依赖于一个公共界面。我将为接口(以及DL将知道的相应BI数据模型)创建一个项目,并为每个实现创建一个项目,以便将其进一步分离。

存储库模式是关于在持久性层和业务层之间创建分离

web上的许多示例仅将其用作数据实体的包装器,从而错误地演示了它。这是不正确的。存储库类/接口的设计应该由业务需求驱动,而不是由第一个数据存储的外观驱动


因此,它是您用例的完美模式。您可以从业务层的角度定义存储库接口,然后为每个数据存储(如MSSQL)创建一个实现。我甚至将该接口放在我的业务层中,以进一步说明这一观点。

存储库模式是关于在持久层和业务层之间创建分离

web上的许多示例仅将其用作数据实体的包装器,从而错误地演示了它。这是不正确的。存储库类/接口的设计应该由业务需求驱动,而不是由第一个数据存储的外观驱动

因此,它是您用例的完美模式。您可以从业务层的角度定义存储库接口,然后为每个数据存储(如MSSQL)创建一个实现。我甚至将该接口放在我的业务层中,以进一步展示这种观点