2014-12-05 4 views
0

мой уровень доступа к данным получает данные соединения из статического класса 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, чтобы я мог устанавливать разные соединения.

+0

Я потерял подключение к Интернету, я редактировал свой ответ только сейчас. –

ответ

5

Отойдите от статических классов. Ваша проблема здесь ясно показывает, почему они могут вызвать у вас серьезные проблемы. Скорее, вы должны реорганизовать свой код, чтобы использовать экземпляр DBConfig, и введите этот экземпляр там, где это необходимо.

+0

, но этот статический класс на основе его сто строк кодов :( –

+4

@ZiadELNaggar Это хороший пример того, почему для первого дизайна, а затем кода ... – Grx70

+0

@ZiadELNaggar сотни?Считайте, что вам повезло, что это не в тысячах :) Посмотрите на него, вы плохой код, и мне жаль, что я не могу дать вам «более быстрое» решение. Но эй, лучше это исправить, нет? –

0

A Неверный способ решить вашу проблему - создать экземпляр объекта в другом домене (минимальные изменения).

  1. Создайте подкласс класса MarshalByRefObject, который ссылается на ваш статический класс.
  2. Создать новый домен
  3. CreateInstanceAndUnwrap метод AppDomain объект для создания объекта в другом домене с отдельным статическим доменом.

Для получения дополнительной информации см Here

B Etter путь рефакторинга кода:

  1. Изменение статического класса к классу одноплодной.
  2. Везде, где вы видите ошибку компилятора, измените его, чтобы использовать экземпляр singleton.
  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;} 
    } 
} 

Примечание: Каждый раз, когда вы создаете сплоченный класс, и вы думаете, что нужно просто один экземпляр этого класса, сделать свой класс синглтон.

+0

Проверьте мое решение, и мне нужно уточнить решение ур, спасибо заранее :) –

+0

@ZiadELNaggar: Если вы хотите иметь два отдельных экземпляра статического класса, вы можете использовать первый метод без каких-либо изменений. Но это не рекомендуется. –

+0

Не могли бы вы привести мне пример? –

0

Я решил проблему, поставив кусок кодов между

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

Вам нужен был два экземпляра статического класса, не так ли? Теперь, как это решение разрешает вашу проблему в целом? –

+0

Нет, я нашел, что для решения этой проблемы требуется больше времени, поэтому я решаю свою основную проблему, чтобы сделать мой уровень доступа к данным несколько подключений. –

+0

Является ли 'DBConfig' вашим соединением? Теперь, где два экземпляра этого статического класса? –

Смежные вопросы