我有一个静态类,我用作项目的“Data Utils”。
该项目有多个表单和类,其中多个表单和类调用此Data Utils类/数据库。
我不想违反DRY原则,因此我不希望有多个OracleConnection组件,每个组件都填充到每个表单上。
我也不想通过让我的Data Utils类获得对我的主表单的“肉体”知识并为OracleConnection访问它来违反凝聚力。
我可以在每个Data Utils方法中创建动态OracleConnection,但这也会违反DRY。
我是将静态类转换为非静态类的最佳解决方案,给它一个OracleConnection成员,并在构造函数中实例化它?
对于后代,这是我所做的,基于LukLed的建议:
internal class GreatAmericanNovelistsData
{
private static OracleConnection oc;
static GreatAmericanNovelistsData()
{
oc = new OracleConnection();
oc.ConnectionString = "User Id=SCLEMENS;Password=HucKfiNn;Server=HANNIBAL;Pooling=True;Min Pool Size=0;Max Pool Size=10;Connection Lifetime=0;Direct=True;Sid=HANNIBAL;Service Name=HANNIBAL;";
oc.Direct = true;
}
答案 0 :(得分:1)
您只能定义一次静态构造函数和初始化连接。 OracleConnection
对象也可以是静态的。详情here。
class SimpleClass
{
// Static constructor
static SimpleClass()
{
//...
}
}
答案 1 :(得分:1)
是我将静态类转换为非静态类的最佳解决方案,给它 一个OracleConnection成员,并在构造函数中实例化它?
但这会违反依赖倒置原则;)
这听起来有点类似于我最近的应用程序,我最终做的是有一个工厂返回我的OracleConnection实例(我有一个工厂,因为我需要确保每个线程1个实例,所以我正在处理在工厂里)。工厂实现了一个接口,各种构造函数接受了一个接口的参数。依赖注入框架(如Unity或Ninject)用于注入适当的工厂。这也使它更容易测试,因为我可以嘲笑工厂。
所以在代码中,我最终做了类似的事情(如果语法稍微偏离,这很让我感到抱歉):
public interface IDbConnectionFactory
{
public IDbConnection GetConnection();
}
public class OracleConnectionFactory : IDbConnectionFactory
{
public IDbConnection GetConnection()
{
return new OracleConnection();
}
}
public class MyAwesomeDataAccess
{
private IDbConnectionFactory dbConnectionFactory;
public void MyAwesomeDataAccess(IDbConnectionFactory() dbConnectionFactory)
{
this.dbConnectionFactory = dbConnectionFactory;
}
public SomeData SomeMethod()
{
var connection = dbConnectionFactory.GetConnection();
// do stuff with connection...
}
}
然后在我的Unity配置中,我映射了IDbConnectionFactory -> OracleConnectionFactory
当然,对于所有情况下的每个人来说,这可能不是最好的,但我只想对一种可能性给出一个想法。希望你找到一个适合你的好方法!