powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как подменить конфигурационный файл на параметры считанные из базы
13 сообщений из 13, страница 1 из 1
Как подменить конфигурационный файл на параметры считанные из базы
    #39848126
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Мое приложение работает от конфигурационного файла типа такого:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Company" value="Demo AZNGA"/>
    <add key="BaseUrl" value="https://api.xero.com"/>
    <add key="ConsumerKey" value="XXXXXXXXXXXXXXXXXXXXXXXXXX"/>
    <add key="ConsumerSecret" value="YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"/>
    <add key="CallbackUrl" value="localhost"/>
    <add key="SigningCertificate" value="C:\\MyFolder\\public_privatekey.pfx"/>
    <add key="SigningCertificatePassword" value="MyPassword"/>
    <add key="ConnectionString" value="Data Source=localhost;Initial Catalog=Dump;Integrated Security=SSPI"/>
  </appSettings>
</configuration>


Я создал модуль:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace Xero.Api.Export
{
    class EnvConfigs
    {
        public void GetConfigs(String cmpName)
        {
            var conString = ConfigurationManager.AppSettings["ConnectionString"];
            string getConnectionSQL = "dbo.uspGetConfigs";
            SqlConnection con = new SqlConnection(conString);
            SqlCommand cmd = new SqlCommand(getConnectionSQL, con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter param;
            param = cmd.Parameters.Add("@companyName", SqlDbType.VarChar, 128);
            param.Value = cmpName;

            con.Open();
            var Reader = cmd.ExecuteReader();
            int i = 1;
            Int32 id;
            string companyName;
            string consumerKey;
            string consumerSecret;
            string status;
            string connectionString;
            string dbName;
            string tableSuffix;
            string cutoverDate;
            string certificatePassword;
            string folder;
            string certificate;

            if (Reader.HasRows)
            {
                while (Reader.Read())
                {
                    id = int.Parse(String.Format("{0}", Reader["Id"]));
                    companyName = String.Format("{0}", Reader["CompanyName"]);
                    consumerKey = String.Format("{0}", Reader["ConsumerKey"]);
                    consumerSecret = String.Format("{0}", Reader["ConsumerSecret"]);
                    status = String.Format("{0}", Reader["Status"]);
                    connectionString = String.Format("{0}", Reader["ConnectionString"]);
                    dbName = String.Format("{0}", Reader["DBName"]);
                    tableSuffix = String.Format("{0}", Reader["TableSuffix"]);
                    cutoverDate = String.Format("{0}", Reader["CutoverDate"]);
                    certificatePassword = String.Format("{0}", Reader["CertificatePassword"]);
                    folder = String.Format("{0}", Reader["Folder"]);
                    certificate = String.Format("{0}", Reader["Certificate"]);
                    connectionString = "Data Source=" + connectionString + "Initial Catalog =" + dbName + "User id =" + tableSuffix + "Password=" + certificatePassword;
                    Console.WriteLine(companyName + "," + status + "," + connectionString + "," + dbName + "," + tableSuffix + "," + certificatePassword + "," + folder + "," + certificate + "Cutover date: " + cutoverDate + consumerKey + consumerSecret);
                    Console.WriteLine(connectionString);
                    i += 1;
                }
            }
            Reader.Close();
            con.Close();
        }
    }
}



Этот модуль в цикле вытаскивает из базы параметры для каждой компании. Для подключения критичны четыре параметра:
consumerKey

consumerSecret

certificate

certificatePassword

Которые заменяют параметры из конфигурационного файла:

<add key="ConsumerKey" value="XXXXXXXXXXXXXXXXXXXXXXXXXX"/>

<add key="ConsumerSecret" value="YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"/>

<add key="SigningCertificate" value="C:\\MyFolder\\cert\\public_privatekey.pfx"/>

<add key="SigningCertificatePassword" value="MyPassword"/>

Мой главный модуль выглядит сейчас так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
using System;
using Xero.Api.Export;

namespace Export
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting the export");
            string cmpName;
            Console.Write("Enter the company name or blank for all: ");
            cmpName = Console.ReadLine();
            //Console.WriteLine("You have chosen: " + AllCompanies(cmpName));

            var configs = new EnvConfigs();
            configs.GetConfigs(cmpName);
            var export = new XeroExport();
            export.ExcelExport();
            //Console.ReadLine();
        }
        public string AllCompanies(string arg)
        {
            if (arg == null || arg == "")
                return "All";
            else
                return arg;
        }
    }
}



Этот кусок делает всю работу:
Код: c#
1.
2.
            var export = new XeroExport();
            export.ExcelExport();



Как мне сделать так, чтобы он вместо конфигурационного файла использовал то, что я считываю из базы?

Одна коллега сказала мне такое:
Когда считываешь данные из базы, сразу создавай новый класс конфиг, где его свойства сет на основании считанных значений.
Потом этот только что созданный конфиг передай в экспорт.

А как это можно сделать?

Не ругайте сильно, опыта в с# у меня несколько недель.

Спасибо.
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848388
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем?
Если все компании - в таблице базы данных, зачем их хранить конфиге?
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848400
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffЗачем?
Если все компании - в таблице базы данных, зачем их хранить конфиге?

Я наверное неправильно объяснил. У меня раньше прорамма работала от конфига, но там можно хранить только одну компанию, если не делать кастомизированное решение.

Я сохранил все компании в базе, но не могу разобраться, как мне теперь программу заставить использовать данные, считанные из базы. Мне коллега сказала такую подсказку:
Когда считываешь данные из базы, сразу создавай новый класс конфиг, где его свойства сет на основании считанных значений.
Потом этот только что созданный конфиг передай в экспорт.

Но для моего уровня, это мало информации. Помогите разобраться как создать этот класс и передать его в модуль, сюда в общем:
Код: c#
1.
2.
var export = new XeroExport();
export.ExcelExport();



Я так понимаю, мне экпорт надо внутри этого модуля вызывать, ибо тут цикл по компаниям:
Код: c#
1.
2.
var configs = new EnvConfigs();
configs.GetConfigs(cmpName);



И там передавать этот новый класс для каждой компании.
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848447
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mКогда считываешь данные из базы, сразу создавай новый класс конфиг, где его свойства сет на основании считанных значений.

Код: c#
1.
2.
var configs = new EnvConfigs();
configs.GetConfigs(cmpName);


Roust_mПотом этот только что созданный конфиг передай в экспорт.

Код: c#
1.
2.
var export = new XeroExport(configs);
export.ExcelExport();
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848449
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mКогда считываешь данные из базы, сразу создавай новый класс конфиг, где его свойства сет на основании считанных значений.

Код: c#
1.
2.
var configs = new EnvConfigs();
configs.GetConfigs(cmpName);


Roust_mПотом этот только что созданный конфиг передай в экспорт.

Код: c#
1.
2.
var export = new XeroExport(configs);
export.ExcelExport();
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848453
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте поставщик конфигурации, определите интерфейсы взаимодействия и работайте с конфигурацией через них, в разных провайдерах будет разная реализация сохранения и загрузки (через бд\файл\реестр\конфигманагер или любым удобным способом).
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848579
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationRoust_mпропущено...

Код: c#
1.
2.
var configs = new EnvConfigs();
configs.GetConfigs(cmpName);


Roust_mпропущено...

Код: c#
1.
2.
var export = new XeroExport(configs);
export.ExcelExport();



Нет, не все так просто, EnvConfigs вызывает хранимую процедуру uspGetConfigs, которая возвращает список конфигураций. Я этот список в цикле считываю в переменные:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            if (Reader.HasRows)
            {
                while (Reader.Read())
                {
                    id = int.Parse(String.Format("{0}", Reader["Id"]));
                    companyName = String.Format("{0}", Reader["CompanyName"]);
                    consumerKey = String.Format("{0}", Reader["ConsumerKey"]);
                    consumerSecret = String.Format("{0}", Reader["ConsumerSecret"]);
                    status = String.Format("{0}", Reader["Status"]);
                    connectionString = String.Format("{0}", Reader["ConnectionString"]);
                    dbName = String.Format("{0}", Reader["DBName"]);
                    tableSuffix = String.Format("{0}", Reader["TableSuffix"]);
                    cutoverDate = String.Format("{0}", Reader["CutoverDate"]);
                    certificatePassword = String.Format("{0}", Reader["CertificatePassword"]);
                    folder = String.Format("{0}", Reader["Folder"]);
                    certificate = String.Format("{0}", Reader["Certificate"]);
                    connectionString = "Data Source=" + connectionString + "Initial Catalog =" + dbName + "User id =" + tableSuffix + "Password=" + certificatePassword;
                    Console.WriteLine(companyName + "," + status + "," + connectionString + "," + dbName + "," + tableSuffix + "," + certificatePassword + "," + folder + "," + certificate + "Cutover date: " + cutoverDate + consumerKey + consumerSecret);
                    Console.WriteLine(connectionString);
                    i += 1;
                }
            }



Основные переменные содержат ключи, чтобы соединиться с каждой компанией и выполнить экспорт:
consumerKey

consumerSecret

certificate

certificatePassword

Мне из этих (основные) и других переменных (такие как tableSuffix, cutoverDate и т.д.) надо собрать конфигурацию и передать в модуль экспорта. А также сделать так, чтобы модуль экспорта брал конфигурацию не из App.config файла, а из мною созданного из переменных класса конфиг.
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848590
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesСоздайте поставщик конфигурации, определите интерфейсы взаимодействия и работайте с конфигурацией через них, в разных провайдерах будет разная реализация сохранения и загрузки (через бд\файл\реестр\конфигманагер или любым удобным способом).

В данной программе это будет все через базу. Мне сложно пока делать такие вещи. Да и потом, что-то подобное у меня уже есть. Ниже куски кода, которые делают аутентификацию беря данные из конфиг файла. Этот код часть оболочки которую написали в Xero. Типа берите кто хотите и дописывайте туда свои приложения. Вот только понять откуда это все вызывается я не могу. А также как заставить приложение брать конфигурационные данные из моих переменных вместо конфиг файла.


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
using Xero.Api.Core;
using Xero.Api.Infrastructure.OAuth;
using Xero.Api.Infrastructure.RateLimiter;
using Xero.Api.Serialization;

namespace Xero.Api.Example.Applications.Private
{
    public class Core : XeroCoreApi
    {
        private static readonly DefaultMapper Mapper = new DefaultMapper();
        private static readonly Settings ApplicationSettings = new Settings();

        public Core(bool includeRateLimiter = false) :
            base(ApplicationSettings.Uri,
                new PrivateAuthenticator(ApplicationSettings.SigningCertificatePath, ApplicationSettings.SigningCertificatePassword),
                new Consumer(ApplicationSettings.Key, ApplicationSettings.Secret),
                null,
                Mapper,
                Mapper,
                includeRateLimiter ? new RateLimiter() : null)
        {
        }
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
using System.Configuration;

namespace Xero.Api.Example.Applications.Private
{
    public class Settings
    {
        public string Uri
        {
            get { return ConfigurationManager.AppSettings["BaseUrl"]; }
        }

        public string SigningCertificatePath
        {
            get { return ConfigurationManager.AppSettings["SigningCertificate"]; }
        }

        public string SigningCertificatePassword
        {
            get { return ConfigurationManager.AppSettings["SigningCertificatePassword"]; }
        }
    
        public string Key
        {
            get { return ConfigurationManager.AppSettings["ConsumerKey"]; }
        }

        public string Secret
        {
            get { return ConfigurationManager.AppSettings["ConsumerSecret"]; }
        }
        public string Company 
        {
            get { return ConfigurationManager.AppSettings["Company"]; }
        }
        public string Folder
        {
            get { return ConfigurationManager.AppSettings["Folder"]; }
        }
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
using System;
using System.Security.Cryptography.X509Certificates;
using Xero.Api.Infrastructure.Interfaces;
using Xero.Api.Infrastructure.OAuth;
using Xero.Api.Infrastructure.OAuth.Signing;

namespace Xero.Api.Example.Applications.Private
{
    public class PrivateAuthenticator : IAuthenticator
    {
        private readonly X509Certificate2 _certificate;

        public PrivateAuthenticator(string certificatePath)
            :this(certificatePath, "")
        {

        }

        public PrivateAuthenticator(string certificatePath, string certificatePassword = "")
        {
            _certificate = new X509Certificate2();
            _certificate.Import(certificatePath, certificatePassword, X509KeyStorageFlags.MachineKeySet);
        }

        public PrivateAuthenticator(X509Certificate2 certificate)
        {
            _certificate = certificate;
        }

        public string GetSignature(IConsumer consumer, IUser user, Uri uri, string verb, IConsumer consumer1)
        {
            var token = new Token
            {
                ConsumerKey = consumer.ConsumerKey,
                ConsumerSecret = consumer.ConsumerSecret,
                TokenKey = consumer.ConsumerKey
            };

            return new RsaSha1Signer().CreateSignature(_certificate, token, uri, verb);
        }

        public X509Certificate Certificate { get { return _certificate; } }

        public IToken GetToken(IConsumer consumer, IUser user)
        {
            return null;
        }

        public IUser User { get; set; }
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
using Xero.Api.Infrastructure.Interfaces;
using Xero.Api.Infrastructure.OAuth;
using Xero.Api.Infrastructure.RateLimiter;
using Xero.Api.Serialization;

namespace Xero.Api.Example.Applications.Private
{
    public class AustralianPayroll : Payroll.AustralianPayroll
    {
        private static readonly DefaultMapper Mapper = new DefaultMapper();
        private static readonly Settings ApplicationSettings = new Settings();

        public AustralianPayroll(bool includeRateLimiter = false) :
            base(ApplicationSettings.Uri,
                new PrivateAuthenticator(ApplicationSettings.SigningCertificatePath, ApplicationSettings.SigningCertificatePassword),
                new Consumer(ApplicationSettings.Key, ApplicationSettings.Secret),
                //new Company(ApplicationSettings.Company, ApplicationSettings.Folder),
                null,
                Mapper,
                Mapper,
                includeRateLimiter ? new RateLimiter() : null)
        {
        }
    }

}
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848640
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныможно сделать свою кастомную реализацию SettingsProvider, и внутри реализации в зависимости от выбранной конфигурации грузить нужные значения. Гуглить по фразе "C# custom SettingsProvider". Один из примеров .
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848795
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
осталось только разобраться, где хранить настройки подключения к базе данных :D явно не в базе данных
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39848798
SirYouGin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m, можно поменять реализацию класса Settings.

Приблизительно таким образом:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
class Settings
    {
        private NameValueCollection settings;
        public string Uri
        {
            get { return settings["BaseUrl"]; }
        }

        public string SigningCertificatePath
        {
            get { return settings["SigningCertificate"]; }
        }

        public string SigningCertificatePassword
        {
            get { return settings["SigningCertificatePassword"]; }
        }

        public string Key
        {
            get { return settings["ConsumerKey"]; }
        }

        public string Secret
        {
            get { return settings["ConsumerSecret"]; }
        }
        public string Company
        {
            get { return settings["Company"]; }
        }
        public string Folder
        {
            get { return settings["Folder"]; }
        }

        public Settings(NameValueCollection settings)
        {
            this.settings = settings;
        }
    }


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
class EnvConfigs
    {
        public List<Settings> getConfigs()
        {
            var configs = new List<Settings>();
            if (Reader.HasRows)
            {
                while (Reader.Read())
                {
                    id = int.Parse(String.Format("{0}", Reader["Id"]));
                    companyName = String.Format("{0}", Reader["CompanyName"]);
                    consumerKey = String.Format("{0}", Reader["ConsumerKey"]);
                    consumerSecret = String.Format("{0}", Reader["ConsumerSecret"]);
                    // ...
                    var settings = new NameValueCollection();
                    settings.Set("id", id);
                    settings.Set("companyName", companyName);
                    settings.Set("consumerKey", consumerKey;
                    settings.Set("consumerSecret", consumerSecret);
                    settings.Set("id", id);
                    configs.Add(new Settings(settings));                    
                }
            }
            return configs;
        }
    }


Код: c#
1.
2.
3.
4.
5.
6.
 //Читаем настройки из файла конфигурации в конфиг по умолчанию
 var defConfig = new Settings(ConfigurationManager.AppSettings);
 //Читаем настройки из БД
 var dbConfigs = new EnvConfigs();
 dbConfigs.getConfigs(); 
 // Дальше выбираем нужный конфиг из списка или конфиг по умолчанию
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39849555
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SirYouGin
Код: c#
1.
2.
3.
4.
5.
6.
 //Читаем настройки из файла конфигурации в конфиг по умолчанию
 var defConfig = new Settings(ConfigurationManager.AppSettings);
 //Читаем настройки из БД
 var dbConfigs = new EnvConfigs();
 dbConfigs.getConfigs(); 
 // Дальше выбираем нужный конфиг из списка или конфиг по умолчанию



А как это написать? Мне нужно перебрать все в цикле и выполнить экспорт для каждой конфигурации.
...
Рейтинг: 0 / 0
Как подменить конфигурационный файл на параметры считанные из базы
    #39849615
SirYouGin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m, это зависит от реализации метода объекта export.ExcelReport().

Если он работает отдельно с каждой конфигурацией, то
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//Читаем настройки из файла конфигурации в конфиг по умолчанию
 var defConfig = new Settings(ConfigurationManager.AppSettings);
 //Читаем настройки из БД
 var dbConfigs = new EnvConfigs();
 List<Settings> configs = dbConfigs.getConfigs(); 

 foreach(var config in configs)
 {
   //Передаем одну конфигурацию
   var export = new XeroExport(config);
   export.ExcelExport();
 }



Если же ему можно передать список из нескольких конфигураций, то
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
//Читаем настройки из файла конфигурации в конфиг по умолчанию
 var defConfig = new Settings(ConfigurationManager.AppSettings);
 //Читаем настройки из БД
 var dbConfigs = new EnvConfigs();
 List<Settings> configs = dbConfigs.getConfigs(); 
 //передаем список конфигураций
 var export = new XeroExport(configs);
 export.ExcelExport();
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как подменить конфигурационный файл на параметры считанные из базы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]