【问题标题】:How to separate two static classes如何分离两个静态类
【发布时间】:2014-12-05 08:19:19
【问题描述】:

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

现在我需要使用不同的 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 静态类,以便建立不同的连接

【问题讨论】:

  • 我失去了互联网连接,我刚刚编辑了我的答案。

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


【解决方案1】:

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

【讨论】:

  • 但是这个静态类基于它一百行代码:(
  • @ZiadELNaggar 数百?算你自己幸运,它不是成千上万:) 面对现实,你的代码很糟糕,很抱歉我不能给你任何“更快”的解决方案。但是,嘿,最好修复它,不是吗?
【解决方案2】:

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

  1. 创建引用静态类的MarshalByRefObject 的子类。
  2. 创建新域
  3. 使用AppDomain 对象的CreateInstanceAndUnwrap 方法在具有单独静态域的另一个域中创建对象。

欲了解更多信息,请参阅Here

B更好的方式是重构你的代码:

  1. 将静态类更改为单例类。
  2. 在您看到编译器错误的任何地方,将其更改为使用您的单例实例。
  3. 现在,创建另一个属性来引用您的第二个实例并将其用于您的目的。

您的代码将是这样的:

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;}
    }
}

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

【讨论】:

  • 检查我的解决方案,我需要澄清一下你的解决方案,提前谢谢:)
  • @ZiadELNaggar:当你想要一个静态类的两个独立实例时,你可以使用第一种方法而不做任何改变。但不建议这样做。
  • 你能给我举个例子吗?
  • @ZiadELNaggar:在This 的例子中,如果Worker 是一个静态类,它可能有不同的静态变量。
【解决方案3】:

我通过在

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

【讨论】:

  • 你需要一个静态类的两个实例,对吧?现在,这个解决方案一般如何解决您的问题?
  • 不,我发现这个解决方案需要更多时间来解决它,所以我解决了我的主要问题,使我的数据访问层有多个连接
  • DBConfig 是您的联系人吗?现在这个静态类的两个实例在哪里?
  • 是的 DBConfig 包含我的连接数据并且不能包含多个连接,我避免代码重构因为它需要更多时间来处理.. 所以我创建 ChangeDatabase() 方法来临时更改 DBConfig 连接数据同时在另一个数据库中执行命令,最后检索我的原始连接数据并使用 CommitDatabaseChanging() 将其分配给 DBConfig
  • 在方法级别上更改连接是暂时的...感谢您的关注:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多