Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何分离两个静态类_C#_Oop_C# 4.0_Design Patterns - Fatal编程技术网

C# 如何分离两个静态类

C# 如何分离两个静态类,c#,oop,c#-4.0,design-patterns,C#,Oop,C# 4.0,Design Patterns,我的数据访问层使用静态字段(ServerName、DBName、UserName、Password)从DBConfig静态类获取连接数据 现在我需要用不同的DBConfig建立两个连接,我尝试创建另一个dll项目,然后将我的dal添加到其中,以从另一个程序集建立另一个连接,当我尝试将生成的dll作为对主项目的引用并尝试更改DBConfig数据时,它会更改主项目的DBConfig类字段 主要项目 static void Main() { DBConfig.DbName = "InvDB"

我的数据访问层使用静态字段(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静态类,以便建立不同的连接,从而远离静态类。你在这里的问题清楚地表明了为什么他们会给你带来严重的麻烦。相反,您应该重构代码以使用DBConfig的实例,并在需要的地方注入该实例

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

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

  • 创建引用静态类的
    MarshallByRefObject
    子类
  • 创建新域
  • 使用
    AppDomain
    object的
    CreateInstanceAndUnwrap
    方法在另一个域中使用单独的静态域创建对象
  • 有关更多信息,请参阅

    B更好的方法是重构代码:

  • 将静态类更改为单例类
  • 无论您在哪里看到编译器错误,请将其更改为使用您的单例实例
  • 现在,创建另一个属性来引用第二个实例,并将其用于您的目的
  • 您的代码如下所示:

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

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

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

  • 创建引用静态类的
    MarshallByRefObject
    子类
  • 创建新域
  • 使用
    AppDomain
    object的
    CreateInstanceAndUnwrap
    方法在另一个域中使用单独的静态域创建对象
  • 有关更多信息,请参阅

    B更好的方法是重构代码:

  • 将静态类更改为单例类
  • 无论您在哪里看到编译器错误,请将其更改为使用您的单例实例
  • 现在,创建另一个属性来引用第二个实例,并将其用于您的目的
  • 您的代码如下所示:

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

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

    我通过将一段代码放在

            //permanently change DBConfig Fields 
            DBConfig.SetGLConnection("ziad-pc", "GLTest", "admin", "3343402"); 
            DBConfig.ChangeDatabase(EgxDataType.GLConnection,"GLTest");
             // here 
            DataAccess.CommitDatabaseChanging(); //Retrieve Last Connection Data
    

    我把一段代码放在

            //permanently change DBConfig Fields 
            DBConfig.SetGLConnection("ziad-pc", "GLTest", "admin", "3343402"); 
            DBConfig.ChangeDatabase(EgxDataType.GLConnection,"GLTest");
             // here 
            DataAccess.CommitDatabaseChanging(); //Retrieve Last Connection Data
    


    但是这个基于它的静态类有上百行代码:(@ZiadELNaggar hundust?算你自己幸运,它没有上千行:)面对它,你的代码很糟糕,很抱歉我不能给你任何“更快”的解决方案。但是,嘿,最好是修复它,不是吗?但是这个基于它的静态类有一百行代码:(@ZiadELNaggar数百行?算你自己幸运,它不是成千上万行:)面对它,你的代码很糟糕,很抱歉我不能给你任何“更快”的解决方案。但是,嘿,最好是修复它,不是吗?我失去了我的互联网连接,我刚刚编辑了我的答案。我失去了我的互联网连接,我刚刚编辑了我的答案。检查我的解决方案,我需要一些关于你的解决方案的说明,提前感谢:)@ZiadELNaggar:当你想要有一个静态类的两个独立实例时,您可以使用第一种方法,无需任何更改。但是这不是推荐的。你能给我一个例子吗?@ZiadELNaggar:在示例中,如果
    Worker
    是一个静态类,它可能有不同的静态变量。检查我的解决方案,我需要一些关于你的解决方案的说明,提前感谢:)@ZiadELNaggar:当你想要有一个静态类的两个单独实例时,您可以使用第一种方法,无需任何更改。但这并不推荐。你能给我一个例子吗?@ZiadELNaggar:在这个例子中,如果
    Worker
    是一个静态类,它可能有不同的静态变量。你需要一个静态类的两个实例,对吗?现在,这个解决方案通常是如何解决您的问题的?不,我发现这个解决方案需要更多的时间来解决它,所以我解决了我的主要问题,使我的数据访问层具有多连接sis
    DBConfig
    您的连接?现在这个静态类的两个实例在哪里?是的,DBConfig包含我的连接数据,不能包含多个连接,我避免代码重构,因为它需要更多的时间来处理。。所以我创建了ChangeDatabase()方法来临时更改DBConfig连接数据,同时在另一个数据库中执行命令,最后检索我的原始连接数据,并使用CommitDatabaseChanging()将其分配给DBConfig在方法级别上更改连接是临时的。。。感谢您的关注:)您需要两个静态类的实例,对吗?现在,这个解决方案通常是如何解决您的问题的?不,我发现这个解决方案需要更多的时间来解决它,所以我解决了我的主要问题,使我的数据访问层具有多连接sis
    DBConfig
    您的连接?现在这个静态类的两个实例在哪里?是的,DBConfig包含我的连接数据,不能包含多个连接,我避免代码重构,因为它需要更多的时间来处理。。所以我创建ChangeDatabase()方法,在另一个数据库中执行命令时临时更改DBConfig连接数据,最后检索原始连接数据,并使用CommitDatabaseChangin将其分配给DBConfig