Friday, February 17, 2017

Which WCF template to be used?

Recently, one of my colleague asked me, which WCF template should I use to create a service? For experienced people, it may be a silly question, but it is one of the common question among beginners, who just entered into the world of services. That’s the motivation who made me write this small post.

Well, let’s first have a look at what all templates are available in Visual Studio 2015 for WCF: 










The developer can choose any of the above templates as per project need. Let’s go through them one-by-one.

WCF Service Library: This template is nothing but a simple service library which uses App.config as its configuration file.

WCF Service Application: This template will create a web site which in turn will be hosting a service in it. Here Web.Config will be used to serve configuration settings.

WCF Workflow Service Application: This template is useful when you want your workflow to be accessed as a web service.

Syndication service Library: This template is useful when you want to expose RSS as a web service.

Hope now you are comfortable on which template to be chosen.Happy learning!

Monday, January 2, 2017

DependencyObject in ViewModelBase - Good or Bad?

First of all, a very-very Happy New Year to all my readers. If you are reading this post, then I’m assuming that you have a working experience of WPF using MVVM. 
Don’t worry, I’m not going to re-write a huge post on what MVVM is and where to use it? This blog is very small which talks about one of the best practices any developer implementing MVVM should follow.

Well, let me provide you the context first. Last week I was going through one of my colleagues’ code and noticed few interesting things in his ViewModelBase class:
  • It was holding few Dependency properties 
  • It was inheriting DependencyObject 

How it sounds to you? Good or … ? 
Of course, that is not at all a good practice as ViewModelBase is the base class for all the ViewModels and is not supposed to contain such code. Well, this is not the only reason. 

There are many other reasons which are making this implementation a BIG NO. 
1st Reason – A DependencyObject was never meant to be a Source of a binding, but rather it is a Target, which means its existence should be in the UI layer. So, if we are inheriting DependencyObject in ViewModelBase class, then we are not adding dependencies on view related objects.

2nd Reason – DependencyObject overrides and then seal two methods Equals and GetHashCode with a reason to prevent derived classes to define value equality for a DependencyObject as such sort of value equality will never be accurate due to value changing capabilities of DependencyObject and its dependency properties. Hence inheriting DependencyObject class in ViewModelBase will never let you override Equals and GetHashCode methods. Official link  

3rd Reason - Serialization – If you want to Serialize anything in VM, it’s not gonna happen because our Base class which is DependencyObject in our case is not Serializable. In other words, DependencyObject class is not marked as [Serializable]. So, the only solution left and can be used as a workaround is to implement ISerializable in ViewModelBase class which is not recommended solution here. 

4th Reason - CLR properties still needs INotifyPropertyChange implementation. 

5th Reason - Thread affinity – It says that an object created on one thread cannot be used by another. A DependencyObject has thread affinity means it can only be used on the thread that created it.

Hence never ever derive ViewModelBase class from DependencyObject. Enjoy learning!!!

Friday, December 30, 2016

Last blog post of 2016

This is my last blog of year 2016. I just want to take a minute to say thank you to all my readers who reads my blog. It’s prodigious erudition with you all.

I wish you all a very Happy New Year and a great beginning. Catch you all in next year with same zeal :) 

Tuesday, December 27, 2016

AccessKey not working on WPF ContentPresenter

Recently I received a query from one of my friends stating that access key is not working in his WPF project when he is using ContentPresenter. So, I thought to share a post on it as it may be helpful for other reader also. Before digging directly into the problem, first let’s see what happens when access key is set directly on the Content property of a WPF Button.

Below is my code for setting a Content on a Button:
<Grid>
        <Button Height="39" Width="100" Content="_Save"/>
</Grid>

If you will run your application with above snippet, you will notice that there is no underscore coming in front of word Save. But as soon as you press ALT key, underscore comes up. Which is an expected behavior :)
Now tweak the code a bit and instead of setting content directly on a button, do it on ContentPresenter as shown below:
<Grid>
        <Button Width="95" Height="34" Background="Orange">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <Rectangle Fill="{TemplateBinding Background}"/>
                        <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Button.Template>
            _Save
        </Button>
</Grid>
Now, if you will run your application with above snippet, you will get an output in which underscore is coming at incorrect place, which is before S.

Question is how to get this underscore at proper location, below S?

No worries. A simple property RecognizesAccessKey does this for you.

<Grid>
  <Button Width="95" Height="34" Background="Orange">
     <Button.Template>
        <ControlTemplate TargetType="Button">
         <Grid>
            <Rectangle Fill="{TemplateBinding Background}"/> 
    <ContentPresenter RecognizesAccessKey="True" Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>
       </ControlTemplate>
     </Button.Template>
_Save
  </Button>
</Grid>

And that's it, we are done. Now if you will run your application, you will see the underscore under S, which is the expected output.
Happy coding!!!

Friday, December 16, 2016

Can ASP.NET Core be chosen over ASP.NET MVC?

Nowadays one of the most popular question is ‘Can ASP.NET Core be chosen over ASP.NET MVC?’
So, to answer this question, let’s have a look at .NET architecture diagram: 

By looking at above diagram, one can easily see that .NET framework is used develop desktop Windows applications using WPF and Windows Forms and Web applications using ASP.NET MVC.

.NET Core supports UWP and ASP.NET Core libraries, in which UWP is used to create Windows 10 apps and ASP.NET Core is used to build Web applications for Windows/Linux/Mac operating systems.

Now regarding what has to be chosen and when has to be chosen, I need not to re-invent the wheel because Jeff has written a very good article on it at ‘’Should I use ASP.NET Core or MVC5?’.

Hope you find this post useful.

Tuesday, December 6, 2016

Live Unit Testing in Visual Studio 2017

Let’s have a look at one of the coolest feature of Visual studio 2017. If you will see below snapshot, there are many new icons here. 

























These icons are part of cool new feature called Live unit testing in Visual Studio 2017 Enterprise.

Live Unit Testing continuously runs and displays unit test result and code coverage inside editor itself. It automatically finds and runs impacted tests for every line of code. In above diagram, Red cross indicates failed test case, Green tick indicates passed test case and Blue minus indicates the code that have no test coverage at all.

Let’s start by looking at failing test case. You can quickly navigate to failing test case by clicking on tooltip as shown below: 






And below is my test case:











At this point, I’m not really sure why this is failing. So, I’ll go ahead and debug this test
We can see here that above particular code has thrown a null reference exception.
Please note that a new exception handler has been introduced in VS 2017. Now one can see complete exception details here itself.








Now as I get to know the cause of failure, I quickly went and initialized my field in my constructor as:







As soon as I updated my code, editor is showing test case as passed. Hope you enjoyed learning new feature.

Friday, December 2, 2016

Performance and Memory tips

Two things play a very significant role in any application development, and those are application’s footprint and performance. Whenever I’m asked to work on these two tracks, I used to visit a huge list of sites to get many more ideas apart from what I already know. So, I thought, why can’t I collate all the good points and add them to my repository. At the same time, I thought of sharing those points in this blog.

Rather than making this blog post full of theory, I’m planning to make it simple by just adding the bullet points.

Uhh! Enough of gossip. Let’s get started by going through some common and important rules.
  • Create object only when it is really required
  • More the objects lesser the performance :( 
  • Grab resources, use them and release at the earliest
  • Default capacity of StringBuilder is 16. So, if you want to store less than 16 values then make sure to set the capacity.
  • Avoid unnecessary boxing and unboxing
  • Prefer lazy loading
  • Use Static variables cautiously as they will stay live throughout application life
  • Avoid using IDisposable everywhere
  • For web apps, enable server GC
  • Throw fever exceptions. Avoid using exceptions to control the program flow. Never catch exceptions that you can not handle. Use Performance Monitor to check exception count and other relevant information
  • Always implement Finally block
  • Prefer value types i.e. If structure can work then why to take class
  • Prefer AddRange() over Add() for adding multiple items to collection
  • Trim your working set. Use and load minimal and only required number of assemblies. Prefer single huge assembly rather than using multiple small assemblies
  • Prefer thread pool rather than creating a new thread for each request
  • Use For loop for string iterations rather than ForEach iterator
  • Use StringBuilder for string manipulation
  • Prefer early binding
  • Be careful while choosing .NET collections as each collection is designed for specific purpose
  • Use StringCollection class to store strings
  • Use Hashtable when frequent query is required on large number of records
  • Prefer ListDictionary as it is faster than HashTable for <10 records
  • For small data go for SortedList. For large data, go for ArrayList and then call Sort method on it.
  • Prefer arrays over collections unless you need some special functionality as they use contiguous memory arrangement and are faster
  • Avoid calling GC.Collect method because it traverse all the generations. If you have to call GC.Collect in your particular niche case, then make sure to clean finalized object also using GC.WaitForPendingFinalizers() and again call GC.Collect. This will collect all the dead objects.
  • Avoid implementing Finalize as it requires 2 GC cycle. Implement it only and only you hold unmanaged resources
  • Call GC.SuppressFinalize method inside Dispose method
  • Be cautious while using Thread.Suspend, as it may lead to deadlock due to incorrect synchronization.
  • Lock(object) is the cheapest method to perform synchronization
  • Avoid locking ‘this’ as it will lock entire object, even few of its member doesn’t require synchronization 
  • Prefer Using statement to ensure Dispose is called 
  • A very good diagram is given on MSDN which talks about few more concepts around this area: 





















Hope you enjoyed reading this article. Please drop your valuable comments, so that I can improvise this list further. Happy learning !!!


Tuesday, August 23, 2016

Associating any file with an installed application

Recently I got a requirement to associate a file having custom extension with the installed version of our own application. So, whenever user clicks on that given extension file, it should open up directly in my WPF application along with the data population. So, let’s check out how you can achieve this:

Step 1 - Creating an application: Create a WPF application or you can take any of your existing application. I’m working on WPF application (using MVVM) but the concept remains same for others, you can go with your Windows Forms or Console application also. That’s pretty acceptable. In my application, I'm taking few customer properties and a file path.

Step 2 - Get key for Signing: For signing my assembly I’m using inbuilt feature of Visual Studio. Go to your project properties, navigate to Signing option as shown below:

                                            








If you already have a key then you can browse and associate it else you can always go ahead and create a new key. Please note: You can use any other way to sign your assembly. In order to make this post simple, I’m using the easiest way J
Once the key is created, it will be automatically added to your project with name as <xxx>.pfx

Step 3 - Signing the manifest: Now as your key is ready, next step is to associate it with your deployment. This can be done by updating the ClickOnce manifests section under Signing tab as shown below:











On the above screen check the given checkbox and browse your pfx file. Note: Please verify expiry date of the certificate once it is browsed successfully.

Step 4 - Associating a File: Next step is to associate our custom file extension, for me it is .shw (this .shw file is in JSON format). Similarly you can take any extension that you would like to associate with your WPF application.  Let’s quickly go to Publish option and furnish all the required details as shown in below image:

















Add default icon for your application using Application Files dialog. Once the icon is associated with your application, you will be able to see that in Application Files dialog. By any chance, if you can’t find your icon in list, please follow my previous post for troubleshooting this J

Step 5 - Tweak your application: Now most important step is to update our WPF application, so that it can understand this new extension (.shw).

Update application startup with following code: 
protected override void OnStartup(StartupEventArgs e)
   {      
      if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null
               && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0)
            {                

               string fileName = "";
               try
                {  
                   fileName = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];
                   Uri uri = new Uri(fileName);
                   fileName = uri.LocalPath;

                   AppShared.SelectedFilepAth = fileName;

                }                

               catch (Exception ex)
                {                   

	  // do exception handling
                }
      }              
       base.OnStartup(e);
    }

Update your ViewModel so that your view can read data as:

public MyViewModelConstructor()
        {                     

             if (!string.IsNullOrEmpty(AppShared.SelectedFilepAth))
             {

                Customer = Newtonsoft.Json.JsonConvert.DeserializeObject<Customer>(System.IO.File.ReadAllText(AppShared.SelectedFilepAth));
                FilePath = AppShared.SelectedFilepAth;
             }            

            else
            {                

                Customer = new Customer() { Name = "Test User", Age = 100 };
            }
        }
 
Step 6 - Final Step: Build your code. Publish it. Install it and wow you are done. After performing all these steps, try double clicking your file, it will automatically pop-up your application with pre-loaded data.
 
It's straight forward. Isn't it?

Ok, let's do something more. Till now we were doing our file association via nice and user friendly GUI. But there is an alternate way available to achieve the same for our command-line lovers in which they have to play with application manifest file directly. Below are the steps to perform the same operation using command line:
  • Open you application manifest. In case, if it is not available please add a new app manifest file to your project and open it into the editor of your choice.
  • Add a new fileAssociation element as a child of Assembly element.
  • Add 4 attributes to this newly added fileAssocitation element – extension, description, progid and defaultIcon. Sample manifest file is given here, In case if you want to associate more file types, then you have to add another fileAssocitation element.
  • Sign application manifest using Mage.exe utility:
mage -Sign <YourApp>.exe.manifest -CertFile <yourCertificate>.pfx

Entire list of Mage command parameters is given over here.
Hope you enjoyed associating your file with multiple ways. Create a file with funny extension, open it and have fun. Happy learning!