Click here to Skip to main content
15,880,543 members
Articles / Programming Languages / C#
Tip/Trick

Dynamic Generation of Client Proxy at Runtime in WCF using a Single Factory

Rate me:
Please Sign up or sign in to vote.
3.94/5 (8 votes)
11 Apr 2014CPOL 32.9K   8   3
Dynamic Generation of Client Proxy at Runtime in WCF using a Single Factory

Introduction

In conventional method, if client proxy for a WCF service is required to be generated at runtime programmatically, an instance of ChannelFactory (generic type) is created passing the interface type of the service (contract) as parameter to the generic class. This requires different implementation for different services for generating client proxy which reduces the generic scope.

This article describes a method to create a factory class which generates client proxy at runtime from the type of the service contract received as parameter. This will eliminate separate implementation requirement by using a single factory class with the help of .NET reflection.

Background

For example, we have the following Service and Service Contract for a WCF service:

C#
[ServiceContract()]
interface IMyService
{
    [OperationContract()]
    void DoSomething();
}

public class MyService : IMyService
{
    public void DoSomething()
    {
        // do something
    }
}

Conventional Method of Client Proxy Generation at Runtime

To generate client proxy in conventional method is to create the ChannelFactory with a prior knowledge of Service contract and this will require separate implementation for each service in the system:

C#
public class Test
{
    public void Test()
    {
        BasicHttpBinding myBinding = new BasicHttpBinding();
        EndpointAddress myEndpoint = new EndpointAddress("http://localhost/MyService/");
        ChannelFactory<imyservice> myChannelFactory = new ChannelFactory<imyservice>(myBinding, myEndpoint);
        IMyService pClient = myChannelFactory.CreateChannel();
        pClient.DoSomething();
        ((IClientChannel)pClient).Close();
    }
}

Factory Method of Client Proxy Generation at Runtime

The following method will eliminate the above deficiency by providing a client factory class. This will help in generating client proxy in a more generic way using the single factory:

C#
public class Test
{
    public void Test()
    {
        //create client proxy from factory
        IMyService pClient = (IMyService)ClientFactory.CreateClient(typeof(IMyService));
        pClient.DoSomething();
        ((IClientChannel)pClient).Close();
    }
}
//Factory class for client proxy
public abstract class ClientFactory
{
    public static object CreateClient(Type targetType)
    {
        BasicHttpBinding binding = new BasicHttpBinding();
        //Get the address of the service from configuration or some other mechanism - Not shown here
        EndpointAddress addess = new EndpointAddress(GetAddessFromConfig(targetType));
        //dynamic factory generation
        object factory = Activator.CreateInstance(typeof
        (ChannelFactory<>).MakeGenericType(targetType), binding, address);
        MethodInfo createFactory = factory.GetType().GetMethod("CreateChannel", new Type[] { });
        //now dynamic proxy generation using reflection
        return createFactory.Invoke(factory, null);
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Microsoft
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
SuggestionThis is refactoring not dynamic client proxy generation Pin
tinu7318-Dec-15 23:11
tinu7318-Dec-15 23:11 
SuggestionInclusion of Method Pin
stixoffire2-Nov-15 10:22
stixoffire2-Nov-15 10:22 
QuestionDo I need to add a reference to the assembly of the service project? Pin
abhi_here2-Feb-15 4:55
abhi_here2-Feb-15 4:55 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.