好的,这是我遇到的一个问题。
我的应用程序中有一些类具有需要数据库连接的方法。我在设计类的两种不同方法之间纠结,这两种方法都以依赖注入为中心:
为调用者在方法调用之前设置的连接提供一个属性。这有一些缺点。
依赖连接属性的每个方法都必须验证该属性以确保它不为空,它是打开的并且不参与事务,如果这会破坏操作。
如果连接属性意外关闭,所有方法都必须(1.)抛出异常或(2.)强制打开。根据您想要的稳健性级别,任何一种情况都是合适的。(请注意,这与传递给方法的连接不同,因为对连接的引用存在于对象的生命周期中,而不仅仅是在方法调用的生命周期中。因此,连接的波动性似乎更高对我来说。)
提供一个
Connection
属性似乎(对我来说,无论如何)为相应的Transaction
属性尖叫。这会在文档中产生额外的开销,因为您必须在使用事务以及何时不使用事务时使其相当明显。
另一方面,微软似乎更喜欢整个集合调用范式。
要求将连接作为参数传递给方法。这有几个优点和缺点:
参数列表自然更大。这对我来说很烦人,主要是在打电话的时候。
虽然连接(和事务)在使用前仍必须经过验证,但对它的引用仅在方法调用期间存在。
然而,呼叫点非常明确。很明显,您必须提供连接,并且该方法不会在您背后自动创建连接。
如果一个方法不需要事务(比如只从数据库中检索数据的方法),则不需要事务。由于方法签名,不乏清晰度。
如果一个方法需要一个事务,由于方法签名,它是非常清楚的。同样,不乏明确性。
因为该类没有公开一个
Connection
或一个Transaction
属性,所以调用者没有机会尝试深入了解它们的属性和方法,从而执行得墨忒耳法则。
我知道,很多。但一方面是微软的方式:提供属性,让调用者设置属性,然后调用方法。这样,您不必创建复杂的构造函数或工厂方法等。另外,避免使用带有很多参数的方法。
然后,一个简单的事实是,如果我在我的对象上公开这两个属性,它们往往会鼓励消费者以邪恶的方式使用它们。(不是说我对此负责,但仍然。)但我只是不想写蹩脚的代码。
如果你在我的鞋子里,你会怎么做?