Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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#_Domain Driven Design_Ddd Repositories - Fatal编程技术网

C# 如何使用存储库模式连接点?

C# 如何使用存储库模式连接点?,c#,domain-driven-design,ddd-repositories,C#,Domain Driven Design,Ddd Repositories,我在谷歌上搜索了太多关于这个模式的内容,我想我自己也弄糊涂了,所以非常感谢您的意见 如果我有一个用于我的小型应用程序的数据库,这将描述它: 公司 名字 地址 模板文件路径 系 名字 地址 报告编号 意外事故 报告编号 位置 驾驶员姓氏 日期 基本上,我已经编写了一些将我的模型对象序列化和反序列化为JSON的代码,但代码凌乱且紧密耦合。我想基本上抽象这一点,所以当我决定以后使用DB时,随着应用程序的增长,切换它将相对容易 现在,如果我要创建存储库(我假设它不是一个存储库),那么方法

我在谷歌上搜索了太多关于这个模式的内容,我想我自己也弄糊涂了,所以非常感谢您的意见

如果我有一个用于我的小型应用程序的数据库,这将描述它:

  • 公司
    • 名字
    • 地址
    • 模板文件路径
    • 名字
    • 地址
    • 报告编号
  • 意外事故
    • 报告编号
    • 位置
    • 驾驶员姓氏
    • 日期
基本上,我已经编写了一些将我的模型对象序列化和反序列化为JSON的代码,但代码凌乱且紧密耦合。我想基本上抽象这一点,所以当我决定以后使用DB时,随着应用程序的增长,切换它将相对容易

现在,如果我要创建存储库(我假设它不是一个存储库),那么方法签名会是什么样子?我会使用任何接口吗?以下是我开始做的事情:

i假设

  • 添加(T实体)
  • 删除(T实体)
  • 更新(T实体)
ICCustomerRepository:IRepository

  • GetAllCustomers()
  • GetCustomerByName(字符串名称)
IDepartmentRepository:IRepository

  • GetAllDepartments()
  • GetDepartmentByName(字符串名称)
然后我开始想,我不会写枯燥的代码。。。客户和部门存储库基本上做的是相同的事情,唯一的区别是方法名称和存储信息的实际DB表或文件我做得对吗?


从我所读到的内容来看,存储库只是实际存储的包装。就像我使用SQLite一样,我将在存储库中建立连接,我的常规代码只处理客户和部门类,不知道SQL连接或反序列化是如何进行的,只知道存储库。

从设计角度看,它看起来还可以。在基本接口(例如,Insert/Delete/Update/GetById)中保留非常通用的方法,在实体特定的接口中保留专门的函数,这是一种相当标准的方法

简单地说,我想说的是,重要的一点是,客户不需要知道除了界面以外的任何东西,所以只需要让您的界面尽可能清晰即可。设置接口后,您可以选择完全独立于客户机来停止存储库实现。

一些想法:

  • Update()
    通常不在存储库级别处理,因为您通常希望一次将更改保存在整个实体图中,而不是一个实体图中。处理这一问题的一种常见方法是通过应用程序服务/用例级别的工作单元,这反过来可能会利用ORM的变更跟踪程序

  • 是的,如果您想将不同的存储库实现注入到它们的使用者中,您将需要接口,例如测试中的模拟存储库

  • 我喜欢做的是采用需求驱动的方法,而不是试图预先确定接口的层次结构。换句话说,在发现需要时创建存储库接口——当您意识到需要与模拟存储库对话时,可能是在单元测试中,也可能是在编写生产代码时。客户机代码使用存储库的方式将塑造您的接口,您将保证这些接口中的每一个都是有原因的


我认为跨存储库共享接口并不重要。它很漂亮,但我的每个存储库都有自己的接口——我使用它。现在,如果目标是完全自动化CRUD,那么一个单一的接口可能会从处理这个问题的代理中变得更有意义——但是,如果想要更具表现力,自动CRUD似乎很快就会崩溃。。