Thursday, September 13, 2012

Injecting WCF service proxy into viewmodel

Injecting WCF service proxy into viewmodel

I currently have a Silverlight application using Prism and MEF. I connect to several WCF services in this application but use a "controller" class to hold the instantiated client-generated service proxy objects.

What I want to do is inject the service references into this controller (like I currently do with the IEventAggregator). I'm unsure how to do this. Do I need to make a wrapper class that implements the service contract interface, and holds a reference to the service proxy object?

What I do now:

/// <summary> /// WCF client used to communitcate with the data WCF service /// </summary> private DataClient _dataClient;  // DataClient is the client generated object from a service reference  /// <summary> /// Region manager for the application /// </summary> private IRegionManager _manager;  /// <summary> /// Application event aggregator /// </summary> private IEventAggregator _eventAggregator;  /// <summary> /// Constructor. Initializes the statistics controller, hooks up all services, and initializes all commands. /// </summary> /// <param name="manager"></param> [ImportingConstructor] public ZOpportunityController(IRegionManager manager, IEventAggregator events) {     _manager = manager;     _eventAggregator = events;      //hookup a WCF service used to retrive GP data     _dataClient = new ZellerGpDataClient();       _dataClient.OpenCompleted += new EventHandler<AsyncCompletedEventArgs>(_dataClient_openCompleted);     _dataClient.GetCustomersCompleted += new EventHandler<GetCustomersCompletedEventArgs>(_dataClient_GetCustomersCompleted);     _dataClient.OpenAsync(); } 

As you can see here, I connect to a service in my controller constructor, but I'd like to just inject the service object into the controller like I do with IRegionManager and IEventAggregator.

EDIT: This blog post was really what I was trying to accomplish.

Answers & Comments...

Answer: 1

Derive a client from ClientBase<TChannel> and make it implement your service contract. The implementation of the contract look similar to this:

public class MyClient : ClientBase<IMyService>, IMyService {   void IMyService.DoSomething(Foo bar)   {     this.Channel.DoSomething(bar);   } } 

Now you can just register that implementation with MEF or any other container and inject it via the constructor.

by : Sebastian Weberhttp://stackoverflow.com/users/750065




No comments:

Post a Comment

Send us your comment related to the topic mentioned on the blog