Using external config files in .NET applications


The config file is place where common variables, database connection strings, web page settings and other common stuff are placed. The config file is also dynamic, so you can change the value of the variable in the config file  without compiling and deploying the .NET app. In multi tenancy environment config file can be complicate for deployment, because  for each tenant different value must be set for most of the defined variables. In such a situation you have to be careful to set right value for the right tenant.

One way of handling this is to hold separate config file for each tenant. But the problem can be variables which are the same for all tenants, and also the case where some variables can be omitted for certain tenant.

One of the solution for this can be defining external config files for only connection strings or appSettings variables, or any other custom config section. In this blog post, it will be presenting how to define connection strings as well as appSettings section in separate config file.

Lets say you have appSettings and connectionStrings config sections, similar like code below:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

	<connectionStrings>
		<add name="SQLConnectionString01" connectionString="Data Source=sourcename01;Initial Catalog=cat01;Persist Security Info=True;Integrated Security=true;"/>
		<add name="SQLConnectionString02" connectionString="Data Source=sourcename02;Initial Catalog=cat02;Persist Security Info=True;Integrated Security=true;"/>
	</connectionStrings>

	<appSettings>
		<clear />
		<!-- Here are list of appsettings -->
		<add key="Var1" value="Var1 value from config01" />
		<add key="Var2" value="Varn value from config01"/>
		<add key="Var3" value="Var3 value from main config file"/>
	</appSettings>

</configuration>

There are three appSetting keys Var1 , Var2 and Var3  and two connectionstrings in the app.config.

The config file above can be split in such a way that variables Var1 and Var2 be defined in separated file, but the Var3 can be remain in the main cofing file. Separate config file may be unique for each tenant.

Now the main config file looks like the following:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

	<connectionStrings configSource="config\connString01.config"/>

	<appSettings file="config\config01.config">
		
		<add key="Var3" value="Var3 value from main config file"/>
	</appSettings>

</configuration>

In the Visual Studio Solution there is config folder in which we created two config files for appSettings section and two config files for Connectionstrings section, in case we have two separate environments for deployments.

exconfigfile01
The flowing code snippet shows the appSettings section implemented in the external file:

<appSettings file="appSettings.config">

	<!-- Here are list of appsettings -->
	<add key="Var1" value="Var1 value from config02" />
	<!-- ... -->
	<add key="Varn" value="Varn value from config02"/>
</appSettings>

The external config file for connection strings looks similar like the flowing:

exconfigfile02

The simple console application shows how to use this config variables in the code:

static void Main(string[] args)
{
    var var1Value= ConfigurationManager.AppSettings["Var1"];
    var var2Value = ConfigurationManager.AppSettings["Var2"];
    var var3Value = ConfigurationManager.AppSettings["Var3"];
    var conn1 = ConfigurationManager.ConnectionStrings["SQLConnectionString01"];
    var conn2 = ConfigurationManager.ConnectionStrings["SQLConnectionString02"];

    Console.WriteLine("Values from config01.config and connString01.config files");

    Console.WriteLine("Var1={0}",var1Value);
    Console.WriteLine("Var2={0}", var2Value);
    Console.WriteLine("Var3={0}", var3Value);
    Console.WriteLine("ConnStr01={0}", conn1);
    Console.WriteLine("ConnStr01={0}", conn2);

    Console.Read();
}

The complete source code can be downloaded from this link.

Moj prvi program


Izvršavanje napisanog programa predstavlja vrlo jednostavan proces pri kojem program od korisnika zahtjeva ulazne podatke, a korisnik od programa očekuje da vrati rezultat odnosno da prikaže izlazne varijable kao traženi rezultat. Ovaj jednostavan proces izvršavanja programa nimalo nije sličan procesu njegovog nastajanja odnosno pisanja. Često program koji pišemo predstavlja dug, zamoran i frustrirajući proces implementacije, testiranja, debugiranja i korekcije. Između svake pobrojane stavke možete staviti litre popijene kafe ili čaja. Jednom kada naš program radi ispravno, svodi se na proces koji smo na početku opisali. Pisanje programa u bilo kojem programskom jeziku za mnoge a posebno developere predstavlja poseban izazov. Prije svega program predstavlja zapis određene količine znanja o nekom problemu. Ono je pohranjeno u elektronskom obliku kojeg možemo koristiti kad god želimo bez bojazni da će ono biti zaboravljeno.

Na primjer kada posmatramo program Kalkulator vidimo da on predstavlja skup određenog znanja iz područja algebre odnosno množenja, dijeljenja, logaritmiranja, trigonometrijskih i drugih transcedentnih funkcija. To je znanje trajno zapisano u digitalni oblik i kad god želimo da ga iskoristimo pokrenut ćemo program i obaviti određenu matematičku operaciju. Iz razloga što napisani program predstavlja akumuliranu količinu znanja, ono prije svega predstavlja neku posebnu vrstu ljudskog stvaranja, koju većinom koriste ljudi koji u opće nemaju to znanje. Kod primjera Kalkulator kojeg smo naveli, većina ljudi poznaje sabiranje, oduzimanje množenje, medjutim algebarske operacije mogu biti jako komplikovane za čovjeka ako koristimo velike brojeve, ili pak trigonometrijske ili logaritmaske funkcije manje poznatih uglova i brojeva.
U kontekstu korištenja programa jedan od najboljih primjera je igranje video igara. Opće je poznato da programiranje video igara predstvlja jedan od najkompleksnijih poslova softverskih inženjera. Da bi bili sposobni programirati video igrice ili razvijati engine za razvoj video igara potrebno je pored znanja razvoja softvera imati znanje iz matemtike posebno vektora, analitičke i diferencijalne geometrije i drugih područja matematike i sličnih nauka. Korisnici takvih kompleksnih softverskih proizvoda su uglavnom djeca od nekoliko godina do odraslih. Većina njih ni neposjeduje osnovne vještine razvoja softvera jer im to nije ni potrebno niti se u budućnosti žele s tim baviti. Upravo zbog ove činjenice programi predstavljaju poseban proizvod kod kojeg njegovi kreatori (developeri, razvojni inžinjeri, softverski arhitekti) imaju poseban odnos.

U ovom poglavlju biće prikazana tri jednostavna listinga u tri različita programska jezika, FORTRAN, C++ i C#. Intencija knjige je da općenito približi problematiku programiranja bez obzira kojim jezikom programer piše. Kroz cijeli tekst prikazat će se osnovne osobine svakog programskog jezika, i navesti ključne riječi koje su sasvim dovoljne da se čitalac upozna sa osobinama programskih jezika, te da u svakom od njih može pisati programe. Intencija ove knjige je da rješenje problema bude neovisno od programskog jezika, jer algoritam koji rješava problem predstavlja najvažniji korak u pisanju programa. Kada znamo algoritam rješenja problema, pisanje programa predstavlja samo jednu of faza pisanja programa. Dakle pri rješavanju problema akcenat će biti na algoritmu, dok će implementacija algoritma u specifičnom programskom jeziku biti u drugom planu. Nekada će program biti napisan u pseudo kodu, koji je lahak za razumijeti i prepisati u neki od postojećih programskih jezika. Kada implementacija određenog algoritma bude zahtijevala dodatna obrazloženja ona će biti navedena za svaki programski jezik ponaosob.
Naš prvi program neće imati nikakvih ulaznih podataka, a kad se pokrene kao rezultat prikazat će rečenicu “Moj prvi napisani program”. Napišimo zadatak za pri program.

Zadatak 1: Napisati program koji na konzolu (izlazna jedinica) ispisuje “Moj prvi napisani program”.

U FORTRAN jeziku jedno od rješenja zadatka 1 može biti:

! glavna ulazna funkcija  
program PrviProgram  
  
  implicit none  
  integer re_i  
 
  write(*,*) "Moj prvi napisani program!"  
  
  re_i = system("pause")  
  end

Listing 2.1 Rješenje zadatka 1 u FORTRAN jeziku

Kod FORTRAN jezika za ispis na konzolu koristi se ključnu riječ write koja je sastavni dio programskog jezika. Kod pisanja programa u FORTRAN jeziku potrebno da program započinje ključnom riječju program a zatim nazivom programa (Listing 2.1), dok završava ključnom riječju end, odnosno end program PrviProgram. Svaki program u ovom jeziku mora zadovoljavati ove uvjete. FORTRAN za razliku od C++ i C# nije osjetljiv na velika i mala slova, tako da svaka ključna riječ može se pisati malim ili velikim slovima ili miješanjem velikih i malih slova. Tako da ključna riječ program može biti napisana i PROGRAM ili pRoGrAm.
U C++ jeziku jedno od rješenja zadatka može biti:

#include <iostream>  
using namespace std;  
//glavna ulazna funkcija   
int main()  
{  
    cout << "Moj prvi napisani program!" <<endl;  
  
    system("Pause");  
    return 0;  
}

Listing 2.1 Rješenje zadatka 1 u C++ jeziku

Svaki program napisan u C++ mora imati započinjati sa ključnom riječju include s kojom naš program povezujemo sa eksternim bibliotekama koje su potrebne za pisanje programa. U naš zadatak povezali smo biblioteku iostream koja služi da bi koristili metode za ispis i čitanje sa konzole, odnosno da bi koristili klasu cout za ispis na konzolu. Uviđamo da C++ ne posjeduje ključnu riječ sličnu FORTRAN jeziku za ispis na konzolu, write. Pored uključivanja određenih biblioteka, svaki C++ program kao početnu tački odnosno metodu ima metodu koja se zove main. Ova metoda ima nekoliko varijanti u smislu da prihvata različit broj argumenata. Tako da main metoda ima slijedeće varijante:

int main( );
int main( int argc, const char** argv );

U slučaju kada main metoda prihvata argumenta, tada pri pokretanju programa je moguće postaviti vrijednosti za date argumente.
U C# jeziku jedno od rješenja zadatka 1 moze biti:

using System;  
  
namespace KnjigaCSharp  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
           Console.WriteLine("Moj prvi napisani program!") 
  
        }  
    }  
}

Listing 2.3 Rješenje zadatka 1 u C# jeziku

U koliko posmatamo C# verziju vidimo da smo koristili standardnu metodu WriteLine klase Console koja čini sastavni dio .NET frameworka koji predstvlja okolinu ili okvir u kojem radi C#. Izvan .NET Frameworka C# ne može da radi. Pri pisanju programa u C# potrebno je slično kao u C++, koristiti biblioteke iz .NET Frameworka, definisati prostor imena (en. namespace) i definisati klasu koja sadrži najmanje jednu metodu koja se zove main. Ralog zašto je u C# potrebno sve ovo deklarisati prije same implementacije main metoda jeste što C# predstavlja čisti objektno orijentisani programski jezik kod kojeg sve počinje sa klasama odnosno instancama klasa koje zovemo objekti.

4th MS Community BiH Conference


MSC2015-badge

For the 4th time the Microsoft Community in Bosnia and Herzegovina organizes conference which will be held at 3th October in Jahorina mountain near Sarajevo.
Each year MSCommunity BiH gathers the best speak in the region with the MVP titles with sessions about the latest Microsoft technologies.
The conference is free to attend and everybody can register for attending at this link.

As a MSCommunity member I am very happy I can be part of the organization and speaker at the conference.
This time I will be speaking about Microsoft Azure and deploying scenarios of web solutions.

The conference is scheduled for 3rd of October. More information about the conference, speakers and sessions can be found here.

mscommconf4thconference

Alati za programiranje II dio


IDE Integrated Development Environment

Danas programi se pišu u posebnim programima za editovanje izvornog koda. Ovi programi sadrže mnoštvo pomoćnih alata koje programerima pomažu tokom pisanja programa. Svi ovi programi integrirani su u jednu aplikaciju koju zovemo Integrated Development Environment, IDE, odnosno integrirana razvojna okolina.
Editor koda predstavlja osnovni alat a jedna od osnovnih mogućnosti editora jeste da ključne riječi, komentare, brojeve, stringove i druge dijelove koda prikazuje različitim bojama i različitim fontom. Ovaj alat zove syntax highlighting ili u prevodu označavanje sintakse.
Pored editovanja koda, druga najvažnija mogućost ovih programa je debugiranje ili mogućnost prolaska kroz linije koda u toku izvršavanja programa. Ovakav alat koji služi za pronalaženje grešaka u programu za vrijeme njegovog izvršavanja kratko zovemo debugger. Na ovaj način programeri imaju mogućnost da ispitaju kod kada program radi. Ovo je jedan od najvažnijih alata koje danas programeri imaju na raspolaganju, i prosto je nemoguće zamisliti razvoj nekog većeg projekta bez debuggera.
Pored editora koda i debuggera treći po važnosti alat za programiranje jeste tzv „Code Compleation“ programi, koji pomažu u odabiru naziva biblioteka i metoda tokom pisanja koda. Naime, kada programer započne da piše neku ključnu riječ ili naziv neke metode, program mu preko plivajućeg prozora nudi nazive metoda koje su dostupne. Različiti programi imaju različite nazive za ovaj alat, ali se generalno može nazvati „Code Compleation“. U Microsoftovom Visual Studio ovaj alat se zove Intellisense. Na slici 2.5 možemo vidjeti Intellisense u akciji.

knjig_ubuntu_terminal 05

Slika 2.5 Intellisense iskačući prozor u Visual Studio 2013

Microsoft Visual Studio

Danas sa sigurnošću možemo tvrditi da je Visual Studio kompanije Microsoft najpoznatiji, najsofisticiraniji IDE za pisanje programa. Ovaj IDE podržava nekoliko programskih jezika: C++, F#, C#, VB, JavaScript, Typescript, Python. A moguće je programirati za nekoliko platformi poput Windows Desktop, Windows Stope App, Windows Phone, Web Sites, Android i iOS. Sadrži bezbroj alata za olakšavanje pisanja koda, pregršt debuggerskih alata, alata za analizi koda, testiranje aplikacija, kontrola performansi i mnoge druge alate. Možemo slobodno kazati da je Microsoft najdalje otišao u razvoju alata za programiranje.

knjig_ubuntu_terminal 06

Slika 2.6 Visual Studio 2013 Ultimate Startni prozor
Moguće ga je skinuti i u besplatnoj verziji u tzv Express ili Community verziji koju ćemo koristiti tokom demonstarcije prijemjera u C++ i C#. Instalacija ovog alata je vrlo jednostavna dovoljno je pokrenutu web Installer datoteku koja se može skinuti sa http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx, te u nekoliko klikova instalirati ovaj IDE.
Verzija Visual Studia koja će se koristiti ovdje, a koja se može skinuti besplatno sa pomenute stranice ima naziv: Visual Studio 2013 for Windows Desktop.

knjig_ubuntu_terminal 07

Slika 2.7 Web Site za Visual Studio 2013 Express for Windows Desktop
Klikom na link Download, pokreće se proces preuzimanja i instalacije programa. Instrukcije o instalaciji i preuzimanje nalazi se na datoj web stranici.

Code::Blocks Open Source IDE za C++ i FORTAN

Drugi program koji će se koristiti za demontraciju pisanja programa u FORTRANu jeste Code::Blocks. Ovaj program predstavlja open source projekat koji je dostupan kako na Windows tako i Linux baziranim OS. Zvanična web stranica ovog IDE je http://www.codeblocks.org. Preuzimanje programa za Windows OS se nalazi na adresi: http://www.codeblocks.org/downloads/26#windows.
Prilikom instalacije ujedno se instalira i C++ kompajler, te nakon završetka procesa instaliranja moguće je odmah pisati i pokretati C++ programe.
Međutim, u koliko želimo programirati u FORTRAN programskom jeziku, moguće je preuzeti prilagođenu verziju Code::Blocksa za FORTRAN sa adrese: http://sourceforge.net/projects/cbfortran. Ova verzija IDE dolazi bez FORTRAN kompajlera koji se može instalirati sa http://sourceforge.net/projects/mingw-w64/ lokacije. Prije samog korištenja pisanja programa potrebno je podesiti putanje za kompajler. Putanje za kompajler podešavamo preko menia Settings->Compilers.

knjig_ubuntu_terminal 08

Slika 2.8 Podešavanje putanje kompajlera za FORTRAN
Code::Blocks posjeduje i debugger za fortran pa ga je dobro podesiti na samom početku instalacije. Slijedeći dijalog prikazuje putanju i podešavanje debuggera.

knjig_ubuntu_terminal 09

Putanje koje se podešavaju, dobijaju se sa lokacije na kojoj je instaliran MinGW. Preporučena lokacija za instalaciju MinGW je C:\MinGW. Nakon uspješno podešenog kompajlera IDE je spreman za pisanje programa.

knjig_ubuntu_terminal 10

Slika 2.9 Code::Blocks verzija prilagođena za FORTRAN

Follow

Get every new post delivered to your Inbox.

Join 672 other followers