C# 如何分离两个静态类
我的数据访问层使用静态字段(ServerName、DBName、UserName、Password)从DBConfig静态类获取连接数据 现在我需要用不同的DBConfig建立两个连接,我尝试创建另一个dll项目,然后将我的dal添加到其中,以从另一个程序集建立另一个连接,当我尝试将生成的dll作为对主项目的引用并尝试更改DBConfig数据时,它会更改主项目的DBConfig类字段 主要项目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"
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
方法在另一个域中使用单独的静态域创建对象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
方法在另一个域中使用单独的静态域创建对象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
是一个静态类,它可能有不同的静态变量。你需要一个静态类的两个实例,对吗?现在,这个解决方案通常是如何解决您的问题的?不,我发现这个解决方案需要更多的时间来解决它,所以我解决了我的主要问题,使我的数据访问层具有多连接sisDBConfig
您的连接?现在这个静态类的两个实例在哪里?是的,DBConfig包含我的连接数据,不能包含多个连接,我避免代码重构,因为它需要更多的时间来处理。。所以我创建了ChangeDatabase()方法来临时更改DBConfig连接数据,同时在另一个数据库中执行命令,最后检索我的原始连接数据,并使用CommitDatabaseChanging()将其分配给DBConfig在方法级别上更改连接是临时的。。。感谢您的关注:)您需要两个静态类的实例,对吗?现在,这个解决方案通常是如何解决您的问题的?不,我发现这个解决方案需要更多的时间来解决它,所以我解决了我的主要问题,使我的数据访问层具有多连接sisDBConfig
您的连接?现在这个静态类的两个实例在哪里?是的,DBConfig包含我的连接数据,不能包含多个连接,我避免代码重构,因为它需要更多的时间来处理。。所以我创建ChangeDatabase()方法,在另一个数据库中执行命令时临时更改DBConfig连接数据,最后检索原始连接数据,并使用CommitDatabaseChangin将其分配给DBConfig