对存储库模式的理解混乱

时间:2018-07-19 14:13:49

标签: c# asp.net-mvc

我是MVC模式的新手,但是我参与了一个项目,要求我实施存储库模式和工作单元,在线提供100多种不同实施方式的大量示例,这也很痛苦,因为没有明确的方法,无论如何,这就是我在做什么,我想请您给我一个为什么我要使用这种该死的模式的理由:

我有很多控制器实例化模型,并在我的控制器中使用它:

public CentralEntities DB = new CentralEntities(); 

我可以在控制器中使用它,例如:

var turbineid = (from s in DB.MasterDatas
                 where s.name == turbinename
                 select new TrBineId
                 {
                     turbineID = s.m_turbine_id
                 }).Single();

TrBineId是我的viewModel,无论如何控制器的数量都在增加,而且在每个控制器中我都有许多不同的LINQ,我应该从通用存储库开始吗?

2 个答案:

答案 0 :(得分:3)

使用存储库模式该死的原因在于实现您的解决方案时明确的关注点分离并在一个域中利用域I / O。可以在整个代码库中重复使用的方式。

您应该开始重新访问OOP,并且需要仔细检查存储库模式

最终,对某些模式的需求已经存在,但是一旦您整理好片段,就会在您的脑海中浮现。

我将开始在网上跟随一些有关存储库模式的教程,以实施概念验证项目并实现其工作原理。

最后,控制反转依赖注入是您需要管理的概念,以将存储库和其他模式集成到项目中以提高代码的可组合性和可测试性。

免责声明:以下链接来自我的网站,有关软件体系结构。您可能需要检查它们,以作为存储库模式的可能参考实现:

答案 1 :(得分:0)

存储库模式允许您使用“单一责任”原则的概念,这意味着(作为概述)一类=一个角色。

您的控制程序类用于管理请求(获取,发布)并发送回响应(FileResult,ActionResult ...)。

对于数据访问(DAL,DAO),通常将创建一个每个模型实体类(ClientRepository,CommandRepository),并创建用于获取它们的方法(GetClients(),GetOneClientById( int id)...)在此类中。

Matías条评论后进行编辑以澄清情况:

将在您的控制器中通过您还将实现的接口(或不带IOC)调用此类。 然后,您将在控制器中创建ClientRepository的类实例,但将其分配给接口类型(IClientRepository)的引用。

**结束编辑**

所以我们可以想象客户实体:

ClientController(All route for clients data)
IClientRepository (interface)
ClientRepository (Class which implement IClientRepository )

然后,在您的控制器中,您将像称呼存储库

IClientRepository clientRepo = new ClientRepository();

然后使用方法:

ICollection<Client> clients = clientRepo.YourMethod(int param1);

优势:

首先,您的代码将更加清晰和可维护。您的DAO(.net中的DAL)将保留数据访问层,并且您可以多次使用GetAllClients方法,并且不会重复自己(DRY)。

您还可以轻松地在方法上应用一些参数(例如顺序,分页限制等)

它也是可测试的,我认为在控制器中调用数据库不会给您合理的单元测试结果。您还将以更加“优雅的方式”捕捉到异常。

小技巧:如果您将对回购模式有更多的经验,可以看看控制反转模式