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.