2012-02-18 37 views
0

我反对其访问其数据库提供Web服务,并公开通过.NET类的系统开发。我们通常的工作方式是创建每当我们需要访问数据库,并直接使用该实例的Web服务类的一个实例;这当然完全违背了IoC并创建了大部分不可测试的代码。我现在正试图设计一种使用IoC的新标准工作方式,以使我们能够编写(更多)SOLID代码。IOC/SRP的设计问题

我目前的解决办法是这样的(不是真的很好的解释):

Web服务被包裹在一个DatabaseConnection类存储Web服务对象作为一个受保护的成员并提供访问常用的一些通用数据库调用。

当我需要实际应用程序中的数据库访问时,我从该类派生(调用新类,例如,ApplicationDatabaseConnection),然后在可以调用Web服务的方法中实现所需的数据库交互。

此类应用程序中未直接使用,但提供用于应用程序的不同部分,其中的每一个是通过在顶层等类的控制器/视图模型代表的“连接器”的接口。每当这些应用功能之一是所谓的(例如,从UI)时,将创建相应的控制器对象,并通过我的ApplicationDatabaseConnection对象作为各自的“连接器”的接口的一个实施方式中,这样的数据库访问被适当地封装和去耦在这一点上,如尽我所知。

我的问题是:虽然这是我在自己的代码中发现实际使用ISP(接口隔离原理)的第一种情况(虽然我很难确定这是否实际上是合理使用该概念) ,恐怕这个班可能做得太多,违反了SRP(单一责任原则)。或者“只为一些不同的消费者提供数据库访问权限”是一项单一的责任?

为了也许做出更清楚一点,这里的大致相关的类会是什么样子:

DatabaseConnection 
    protected m_webservice 
    public OftenUsedDatabaseAccess() 

ApplicationDatabaseConnection : DatabaseConnection, IConnectorA, IConnectorB 
    public IConnectorA.RetrieveRecords(fieldValue) 
    public IConnectorB.WriteStuff(listOfStuff) 

FunctionAController 
    private m_IConnectorA 

FunctionBController 
    private m_IConnectorB 

我能想到的做的替代品不是真的看起来是理想的,以我满意。

要分割该数据库访问功能,该ApplicationDatabaseConnection类只能是一个工厂类Create方法不同的连接器(后面IConnectorAFactoryIConnectorBFactory接口) - 但真的有没有什么有没有必要工厂模式;没有什么我只知道实例化“控制器”对象。

此外,实际的连接器类基本上也需要衍生DatabaseConnection,因为它们需要相同的基本功能,然后(最迟)整个构造变得相当不祥。

我想我已在我的思想有些点是错误的一步,现在是完全在错误的轨道上。这种解决方案的结构应该是什么样子?任何推动正确的方向将不胜感激。

编辑:

@Tobias的回答让我意识到,我忘了一个重要的细节:有两个不同版本的Web服务的使用几乎相同的能力,而是完全不同的API,这是一个被封装它之所以。另一个是如果我的逻辑类直接访问Web服务(或通过接口),他们还关心构建Web服务查询的所有细节,这使得更紧密耦合的代码(类型我们一直在生产)并违反了SRP - 因此也是连接器接口的想法。

回答

0

许多个月后,我知道“ApplicationDatabaseConnection”方法不仅违反了SRP,而且还OCP,同时另外阻碍模块化。

我最终采用的路线有点类似于我描述的“工厂”选择 - “主要”DatabaseConnection对象是一个子类,它也有一个“创建”方法,该方法需要工厂用于特定的DatabaseConnection派生,并且不会不关心它究竟产生了什么。这样每个控制器都可以请求自己的连接对象,并且可以添加主应用程序不知道的控制器(即通过MEF)。

0

为什么不只是创建一个接口,如MyWebService,并在MyWebServiceImpl中调用您的服务?可能会暴露相同的方法作为你的服务,并委托给它...