Managing Multiple Configuration File For Different Application Life cycles In .Net Applications

by Vahid 25. May 2009 16:50

All of us have already dealt with the problem of promoting configuration files in different application life cycles. this problem can be as simple as managing different connection strings for different databases in each environment to managing the other complicated settings in each environment.

so many times it happens that we forget to update the configuration file (web.config or app.config) before promotes. what we had already done was to keep one configuration file for each environment (development, testing, staging …) and after promote before build overwrite the the existing configuration file. but even in this case we used to miss to update the configuration file with the latest information. anyway i came across the very good solution in Scott Hanselman's blog. ok here is the solution.

  1. In your project Click the configuration management dropdown and select "Configuration Manager."image

You'll probably have Debug and Release configurations, but you can also make custom ones and base them on existing configuration. In this dialog I've made a new "Deploy" and I'll base it on the "Release" configuration.

WindowClipping (8)

Make sure to create a Solution Configuration AND a Project Configuration, as they are different. Here I've made one called Deploy for the Project also. If you get an error message, be aware of the "Create new project configurations" checkbox. You might get a warning if you are making a new configuration and the dialog tries to make another configuration with the same name; uncheck the checkbox if that happens. Of course, you can have as many Configurations as you'd like.

deploy

2. Add some custom configuration stuff in web.config, like connectionStrings:

	   1: <connectionStrings>
	
	   2:     <add name="Foo"
	
	   3:          connectionString="Data Source=localhost;Initial Catalog=DatabaseName;
	
	   4:                            User Id=sa;Password=debug;"
	
	   5:          providerName="System.Data.SqlClient" />
	
	   6: </connectionStrings>
	

See now I've made the password in my nonsense connectionString = "debug"? Now, create three new web.config's by CTRL-dragging the web.config on top of the project. Name them web.config.debug, web.config.deploy, and web.config.release. Make the password equal to "deploy" and "release" respectively.

WindowClipping (10)

3. Ok,  now we've got different configuration and different configuration files. Let's create a batch file called "copyifnewer.bat" and here's the contents:

	   1: @echo off
	
	   2: echo Comparing two files: %1 with %2
	
	   3:  
	
	   4: if not exist %1 goto File1NotFound
	
	   5: if not exist %2 goto File2NotFound
	
	   6:  
	
	   7: fc %1 %2 
	
	   8: if %ERRORLEVEL%==0 GOTO NoCopy
	
	   9:  
	
	  10: echo Files are not the same.  Copying %1 over %2
	
	  11: copy %1 %2 /y & goto END
	
	  12:  
	
	  13: :NoCopy
	
	  14: echo Files are the same.  Did nothing
	
	  15: goto END
	
	  16:  
	
	  17: :File1NotFound
	
	  18: echo %1 not found.
	
	  19: goto END
	
	  20:  
	
	  21: :File2NotFound
	
	  22: copy %1 %2 /y
	
	  23: goto END
	
	  24:  
	
	  25: :END
	
	  26: echo Done.
	

Basically this batch file will copy a file over another if the files don't match. It's not strictly "copyifnewer" (like, not at all) but it does the job.

Why bother with a batch file to check for changes and not just copy over the file every time? Well, each time you copy over a web.config it restarts all the designers and running AppDomains that are watching that file. No need to copy over a file if it hasn't changed...everything will churn less.

Put this copyifnewer.bat file in the root of your project.

WindowClipping (10)

4. Create a Pre-build Event. Right-click on your Project and select Properties. Click Build Events and in the "Pre-build event command line" and enter this value:

	"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config"
	

Notice the magic dust, the $(ConfigurationName) project variable, that contains "Debug" or "Release" or "Deploy."

WindowClipping (9)

5. Build. Now if you build, you'll see in the Build Output the batch file being run and the files being copied. Because it's a Pre-Build Event it'll be seen in both the Build Output in Visual Studio .NET.

When you build within Visual Studio the currently selected item in the drop-down list is the current configuration.  now you have different configuration file for each build

there is catch here and that is we have to remember that we've got to keep web.config's in sync if there's lots of settings, but we could totally break it apart via "include files."

Tags: , ,

.Net | Technical

The C# Programming Language Version 4.0

by Vahid 4. April 2009 16:02

 browsing in the internet i came across a blog post about the new C# programming language spesifications (C# 4.0) and thought of sharing them with you. hope you like it.

http://software.intel.com/en-us/blogs/2009/03/30/the-c-programming-language-version-40/

Tags:

.Net | Technical

LinqPad, A great tool to work and learn LINQ

by Vahid 30. January 2009 14:36

Want to learn LINQ? looking for a lightweigh and fast application to evaluate your linq expression? now check this out. i found a very good free application which lets you interactively query SQL databases in a modern query language: LINQ. LINQPad is also a great way to learn LINQ: it comes preloaded with 200 examples from the book, C# 3.0 in a Nutshell.  And finally LINQPad is more than just a LINQ tool: it's a code snippet IDE that instantly executes any C#/VB.net expression, statement block or program. Put an end to those hundreds of Visual Studio Console projects cluttering your source folder! you can get it from here.

Tags: ,

.Net | Learning resource | Technical | Tools

Comparision between C# and JAVA

by Vahid 25. January 2009 15:30

 

here is a quick comparision between microsoft c# (.net) and java 

 

Concept C# Java Notes
Virtual machine CLR JVM CLR is not quite the same as JVM concept, but very similar.
Namespace namespace/
using
package/
imports
C# allows multiple namespaces in a file, Java does not.
Attributes [attribute] @annotation C# 1.0, Java 1.5
Base class base super  
abstract objects abstract class abstract class  
abstract methods abstract abstract  
sealed objects sealed final In both cases, sealing is discouraged.
sealed methods sealed final  
replacement methods new keyword not supported Effectively ignores the base method.
constants const / readonly final static  
Enum's enum keyword enum keyword C# 1.0, Java 1.5
virtual functions explicit virtual always virtual This is one of the gotcha's when working between the two languages
override intention override @Override (though members override by default) Causes compiler error if method is not actually overriding a base method.
Class/Type representation of simple types Map 1:1 with the simple type keywords. Behave different to simple type keywords. C# seems more natural than Java in it's behavior
Getters/Setters get/set keywords, behave like properties Explicit get/set methods Again, C# seems more natural with this.
Events Typically via delegates Typically via interfaces  
Reference equivalence

Object.

ReferenceEquals()

== Another C# vs Java gotcha.
Value equivalence

== or

Object.Equals()

object.equals(),

== for value types

Java's choice of using == for reference equals adds to the need to distinguish between objects and value types.
Object introspection Object.GetType() object.class Very similar
Exceptions thrown by method implicit throws keyword Actually liking Java's philosophy here, albeit taking some getting used to.
Stack scoping using keyword, or try/finally keywords  try/finally keywords 'using' keyword is syntax sugar that calls IDisposable.Dispose() method at end of block.
Simple synchronization lock keyword synchronized keyword 'synchronized' can also be used on a method.
Generics class<type> class<type> C# 2.0. Java 1.5. C# has a cleaner implementation and discovery of generics in reflection. In Java, class and class<type> cannot co-exist. class becomes synonymous to class<object>.
Output parameters out, ref Not allowed Not a huge loss in Java, there are simple workarounds.
Switch fall-through Not allowed Allowed  
iteration foreach(type x in y) for (type x : y) C# 1.0. Java 1.5.
Lambda/Closures => (future) C# 3.0. Java 1.7 (maybe)

 

Tags: ,

.Net | JAVA | Technical

IsNumeric() function in C#?

by Vahid 3. January 2009 05:36

hi,

as you may know c# is missing the nice and usfull IsNumeric function which is available in VB.net. but it is a trivial task to implement a generic equvelant function for it. look at the following code. it will return true if the value is numeric and false if the value is false.

static bool IsNumeric(object value)

{

double retNum;return Double.TryParse(Convert.ToString(value), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);

}

 

Tags: ,

Technical | .Net