Question

I have a ViewModel class which I want to resolve via the unity ServiceLocator, but my viewModel requires a parameter to the constructor. The parameter's type is one of the entities in my application (a Customer object) rather than some service implementation. I know that coding against the Unitycontainer itself I can pass a paramater like this:

 _container.Resolve<CustomerDetailViewModel>(new ParameterOverrides {{"customer", customer}});

but if I dont have direct access to the container I need to go via the ServiceLocator like this:

(CustomerDetailViewModel)ServiceLocator.Current.GetInstance<CustomerDetailViewModel>();

However using the second approach I have no way to pass in any parameters to the ServiceLocator. Is there any way this can be done? Is it "wrong" to get an instance of the Container from the ServiceLocator and then use that?

Was it helpful?

Solution

The problem is that you are trying to inject an entity (Customer in this case) into a class. Entities are short lived objects and they don't tend to be good candidates for being injected.

Instead of injecting a Customer, inject a ICustomerRepository service. You can register an ICustomerRepository implementation in the startup path of the application and this way you won't have to call the container directly, which makes the application design cleaner and the unit tests easier.

OTHER TIPS

If you write a wrapper for the ServiceLocator you can hold the unity container within the wrapper and the expose an additional resolve method overload that takes the ParameterOverrides property. Then the method could use the unity container to do the resolution as per your first code snippet rather than the ServiceLocator code snippet.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top