如何分隔两个静态类

时间:2014-12-05 08:19:19

标签: c# oop c#-4.0 design-patterns

我的数据访问层从DBConfig静态类获取带有静态字段(ServerName,DBName,UserName,Password)的连接数据。

现在我需要与不同的DBConfig建立两个连接,我试图创建另一个dll项目然后添加我的dal来建立另一个组件的另一个连接,当我试图添加结果dll作为主项目的参考并尝试更改DBConfig数据,然后更改主项目的dbconfig类字段

主要项目

static void Main()
{
     DBConfig.DbName = "InvDB";
     DBConfig.Password = "3343402";
     DBConfig.ServerName ="ziad-pc";
     DBConfig.UserName = "admin";
     DBConfig.Lang = "AR";
     GLINVSERVICES.ServiceConfig.Init("ZIAD-PC", "GLTest", "admin", "3343402");
}

另一个DLL项目

namespace GLINVSERVICES
{
public static  class ServiceConfig
{
    public static void Init(string ServerName, string DBName, string UserName, string Password)
    {
        DBConfig.Datatype = EgxDataType.Mssql;
        DBConfig.DbName = DBName;
        DBConfig.Lang = "AR";
        DBConfig.ServerName = ServerName;
        DBConfig.UserName = UserName;
        DBConfig.Password = Password;
    }                     
}
}

我需要分离DBConfig静态类,以便我可以建立不同的连接

3 个答案:

答案 0 :(得分:5)

远离静态类。你在这里的问题清楚地表明了他们为什么会让你陷入严重的麻烦相反,您应该重构代码以使用DBConfig的实例,并将该实例注入需要它的位置。

答案 1 :(得分:0)

解决问题的一种 Wful方法是在另一个域中实例化您的对象(最小更改)。

  1. 创建一个引用您的静态类的MarshalByRefObject子类。
  2. 创建新域
  3. 使用CreateInstanceAndUnwrap对象的AppDomain方法在另一个域中使用单独的静态域创建对象。
  4. 有关详细信息,请参阅Here

    B etter方式是重构您的代码:

    1. 将静态类更改为单例类。
    2. 在任何地方,您都会看到编译器错误,请将其更改为使用您的单例实例。
    3. 现在,创建另一个属性以引用您的第二个实例并将其用于您的目的。
    4. 您的代码将是这样的:

      public class YourClass
      {
          private readonly static YourClass _firstInstance = new YourClass();
          private readonly static YourClass _secondInstance = new YourClass();
      
          public YourClass Instance{
              get { return _firstInstance;}
          }
      
          public YourClass AnotherInstance{
              get { return _secondInstance;}
          }
      }
      

      注意:每次创建一个有凝聚力的类并且您认为只需要该类的一个实例时,请将您的类设为单例。

答案 2 :(得分:0)

我通过在

之间放置一段代码来解决它
        //permanently change DBConfig Fields 
        DBConfig.SetGLConnection("ziad-pc", "GLTest", "admin", "3343402"); 
        DBConfig.ChangeDatabase(EgxDataType.GLConnection,"GLTest");
         // here 
        DataAccess.CommitDatabaseChanging(); //Retrieve Last Connection Data