Abstract Class to Dynamically Alter EntityFramework Domain Service Connection
In my previous post I wrote about overriding the LinqToEntitiesDomainService.CreateObjectContext() method to dynamically set the connection string for the used by the domain service.
I realised that I would be using this in a couple of different services in my current project and potentially use it in the future so I wrote a generic abstract class to enable me to do this.
The Class
using System;
using System.Data.Objects;
using System.ServiceModel.DomainServices.EntityFramework;
using System.ServiceModel.DomainServices.Server;
public abstract class DomainServiceBase <TContext> : LinqToEntitiesDomainService<TContext>
  where TContext : ObjectContext, new ()
{
  protected override TContext CreateObjectContext()
  {
    // Build up the connection string
    string connection = "connectionString";
    Type contextType = typeof(TContext);
    object objContext = Activator.CreateInstance(contextType, connection);
            
    return objContext as TContext;
  }
  protected override void OnError(DomainServiceErrorInfo errorInfo)
  {
    // Deal with errors
  }
}
You then inherit from this DomainServiceBase class for your Doman Services rather than LinqToEntitiesDomainService.
Key Points
- 
    public abstract class DomainServiceBase <TContext> : LinqToEntitiesDomainService<TContext> where TContext : ObjectContext, new ()Generic class inherits from the LinqToEntitiesDomainService class. Constrain the types of objects that can be accepted to anything that inherits from ObjectContext and has a public parameterless constructor. 
- 
    Type contextType = typeof(TContext); object objContext = Activator.CreateInstance(contextType, connection);Use the Activator class to create an instance of the specified generic type, using the connection string that you have built up as a parameter. This will call the ObjectContext(string) constructor. 
- return objContext as TContext;Cast the object to the supplied type before returning it.