Thursday, August 19, 2010

Enterprise Library 5.0 – Configuration Services Part -II

Last week, we saw how to use the same configuration file for two different applications. If you have not read the post yet, you can read it here. This week, we will look at how configuration services can help you use a section from a shared configuration file. For the sake of continuity, I will use the same example we used in the previous post.

In the previous post, we added a separate logging section, the change here is that we will just add a redirected section in the Configuration Sources element itself. To enable section redirection, the following has to be done

  • Change the configuration source to System Configuration Source. This will enable the application to use its default app.config
  • Add a redirected section. You can do this by expanding the Configuration Sources section and then add a redirected section. The source of the configuration section should now point to the section in the external file. The screenshot below shows how to add a redirected section

image

The configuration file now looks like the below

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <configSections>
   4:         <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
   5:     </configSections>
   6:     <enterpriseLibrary.ConfigurationSource selectedSource="System Configuration Source">
   7:         <sources>
   8:             <add name="System Configuration Source" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SystemConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
   9:             <add name="Shared Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
  10:                 filePath="C:\Users\r.vaideeswaran\Documents\Visual Studio 2010\Projects\EntLibTest\logging.config" />
  11:         </sources>
  12:         <redirectSections>
  13:             <add sourceName="Shared Config" name="loggingConfiguration" />
  14:         </redirectSections>
  15:     </enterpriseLibrary.ConfigurationSource>
  16: </configuration>




Note how the logging is now configured as a redirectSection. This will ensure that the logging section is picked up from the shared config file. The code in the previous post will now work with this configuration as well without any changes. For the sake of reference, below is the code




   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         LogWriter textWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
   6:         LogEntry testEntry = new LogEntry();
   7:         testEntry.Message = "Logging the loading of EntLibTest1";
   8:         testEntry.Priority = 2;
   9:         testEntry.Categories.Add("General");
  10:         textWriter.Write(testEntry);
  11:  
  12:         Console.WriteLine("Message Logged");
  13:         Console.ReadLine();
  14:     }
  15: }



While in theory, this is the same as using the configSource for a particular setting, one of the advantages is that configSource doesnt permit you to use absolute paths (except for appSettings where you can use the file attribute instead of configSource). Sometimes, this can be a real pain. The Ent Lib Configuration Sources solves that problem.



Hope I was able to give you an idea of how to use a redirected section with Ent Lib 5.0. Happy Coding!!!!

Sunday, August 8, 2010

Enterprise Library 5.0 – Configuration Services Part - I

Microsoft recently released Ent Lib 5.0. While most of the application blocks are the same as 4.1, one of the new kids on the block is Configuration Services. Hence, I will start off this series on Ent Lib 5.0 by taking a closer look at the Configuration Services.

The configuration services provides three capabilities when it comes to managing config files

  • Ability for multiple applications to use the same config file
  • Ability to use of a specific section from a shared config file
  • Ability for a configuration file to inherit from another config file

In this post, we will see how to enable multiple applications to share the same config file.

Multiple Applications using the Same Config File

I will start off by creating a simple console application. For first timers, right click on the config and you should see a context menu to edit enterprise library configuration.

Clicking on the menu brings up the Ent Lib configuration console. The console has been re-designed in the latest version of enterprise library. To add a configuration source section, there is a menu called “Add Configuration Settings” under Blocks menu. Click on it and you should see a Configuration Section now added. Click on the image icon to expand the section and add a File Based Configuration Source.

Provide the values of the config name and the path of the config file. In the selected source dropdown, select the shared source that we have just configured. Save the settings and right click on the Configuration Sources section and click on Validate. You will get the list of warnings and errors, if any. Let us take a moment to look at the changes in the config. The following section has been added under the <configuration> section

<configSections>
<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>

<enterpriseLibrary.ConfigurationSource selectedSource="Common Config">
<sources>
<add name="System Configuration Source" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SystemConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="Common Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
filePath="CommonConfig" />
</sources>
</enterpriseLibrary.ConfigurationSource>

When you close the enterprise library console, you should now see a commonconfig.config file in your project path. Right click and include the same in your project. Make sure you change the property of the file to copy over to the output path. This will now be the configuration that your application now uses.

To test this, I have added a logging application block and used the following code to log an entry into the event log.

   1: LogWriter textWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
   2: LogEntry testEntry = new LogEntry();
   3: testEntry.Message = "Logging the loading of EntLibTest";
   4: testEntry.Priority = 2;
   5: testEntry.Categories.Add("General");
   6: textWriter.Write(testEntry);
   7:  
   8: Console.WriteLine("Message Logged");
   9: Console.ReadLine();


Do remember to make the appropriate configuration changes to ensure logging is enabled. Running the application creates an entry in the event log. I now add another project to the same solution and update the configuration source to point to the commonconfig.config of the first project. Below is a snapshot of how my config for the second project looks like.

image

You should be able to run the application without making any other changes and ensure that messages are logged from the second console application as well.

Before all you web developers get excited, please remember that this feature does not work with web applications just yet. You can see the details of why in this blog.

That concludes our first look at Configuration Services in Enterprise Library 5.0. I will dig into the other two aspects in subsequent posts. Happy Coding!!!

Monday, July 19, 2010

Code Generation with VS 2010

 

Have been off for quite some time, so its good to be back  blogging. I will start off with a relatively light post.

All of us know that you can create Architectural Diagrams in VS 2010 using the architecture menu. But once, you have done creating the diagrams how do you actually make the diagrams generate code? The last thing you want to do is to create the diagrams and write the code for it manually.

Though VS 2010 does not have built in support for code generation, you can have it generate code by downloading and installing Visualisation and Modelling Feature Pack.

Once you download and install the feature pack from the link above, there are a couple of small things you have to do to get your diagrams ready for code generation. The first thing is to set a profile to your model. i.e tell the model which language to generate code.

You can do this by viewing the properties of the model explorer. You should see an attribute called Stereotypes as shown in the diagram below.

image

 

Select C# namespace. As you can see, the whole code generation works on T4. So if you want to have code generated in SQL for example you could just write your text transformation templates and you should be ready to go.

Actually, there is a very good blog here on how exactly to write your own T4 templates for code generation.

Once you have done that, you can then configure how your classes and namespaces should be named and organised. You do this by clicking on Architecture-> Configure Default code generation settings.

image

Beware, by default, the namespace is always the name of the model so be wary when you name the model because once you set it, you will not be able to change it. You should now be ready to start generating code. Right click on your modelling diagram and you should see a generate code menu as shown. You can set the path under which you want the class to be generated here.

 

image