Resolving a class with a custom parameter in Simple Injector - c#
I'm creating a WPF MVVM application using Simple Injector as DI container. Now I'm having some issues when I'm trying to resolve a view from Simple Injector, because I'm in need of passing a parameter into my constructor at construction time (not when registering the view to the container, thus this is not applicable: Simple Injector pass values into constructor).
What I'm after is something like this:
var item = container.GetInstance<MyType>(myParameter);
I've read several places that this is not possible in Simple Injector because it should not be done (including here: https://simpleinjector.codeplex.com/discussions/397080).
Is this true, and if so, how could I do this instead?
Background information
I have a collection of multiple view models and models which are looked up by a specific key, and the parameter I want to pass into the view is the key for the view model to use. I've found this necessary because the view models and the models are used in multiple locations of the application, and need to stay in sync / be the same instances if they have the same key. I don't think I'm able to use lifetime scope to solve this, and there is no way I know the keys when I'm registering to the container. I've also understood that the ViewModelLocator approach might be the ServiceLocator (anti-?)pattern, however, currently it is the best I've got.
My constructor currently looks like this, and I want the IViewModelLocator to be resolved, while I pass in the key:
public FillPropertiesView(IViewModelLocator vml, object key)
{
// .. Removed code
// Assign the view model
var viewModel = vml.GetViewModel<FillPropertiesViewModel>(key);
DataContext = viewModel;
}
The IViewModelLocator looks like the following (and a similar interface exists for models).
public interface IViewModelLocator
{
// Gets the view model associated with a key, or a default
// view model if no key is supplied
T GetViewModel<T>(object key = null) where T : class, IViewModel;
}
Now I have the following questions:
What is the best way to be able to resolve the view with the view model key?
Do I have to do some refactoring to enable this?
Am I missing out on some of the power of the DI container since I have created my own dictionary based ViewModelLocator?
Extended information
I have shown the ViewModelLocator above, and the reason I'm using this is to keep blendability (basically it just provides me with design time data when opened in Blend). The runtime view model could have been the same for every instance of the view (not dependent on the key), if I did not have to have different windows opened at the same time (see next paragraph). The issue described above, however, is the same when the ViewModel is fetching a model, and the ModelLocator needs a key to fetch an existing model if it exists.
This is part of a VSTO application targeting PowerPoint (which affects some parts of the design). When an object on screen is selected, a task panel is opened (this is basically the FillPropertiesView explained above). The object that is selected has a key that is supplied to the view, in order for the view to extract the correct view model from the ViewModelLocator. The view model will then get a reference to a model by using a IModelLocator (similar to the IViewModelLocator) and the same key. At the same time, a controller will fetch the model from the ModelLocator by using the same key. The controller listens to change events from the model and updates the objects on screen. The same process is replicated whenever a new object is selected, and at the same time multiple windows could be open that interacts with the same or different objects simultaneously (that is, with multiple task panes all with unique view models).
Up until now I have resolved the view with a default, parameterless constructor, and then injected the view model with a method call afterwards:
// Sets the view model on a view
public void SetViewModel(IViewModelLocator vml, object key)
{
// Assign the view model
_viewModel = vml.GetViewModel<FillPropertiesViewModel>(key);
DataContext = _viewModel;
}
I never had to register the view with the container, but resolved the concrete type like this:
string key = "testkey" // read from the selected object
var view = container.GetInstance<FillPropertiesView>();
var vml = container.GetInstance<IViewModelLocator>();
view.SetViewModel(vml, key);
This issue surfaced when I tried to refactor this so that I did not have to call the SetViewModel() method every and manually resolve the view models etc. It got very messy when I also had to do this manual initiation within the view model to initiate the model in the same way.
ViewModelLocator
The ViewModelLocator is currently working as a wrapper around the DI container, i.e. the view models are registered in Simple Injector.
The registrations are like the following (in a class called CompositionHost):
container.RegisterSingle<IViewModelLocator, ViewModelLocator>();
container.RegisterSingle<IModelLocator, ModelLocator>();
The implementation looks like this:
// Base implementation used by ViewModelLocator and ModelLocator
public class ServiceLocator<TService> where TService : class
{
private readonly Dictionary<CombinedTypeKey, TService> _instances =
new Dictionary<CombinedTypeKey, TService>();
// Gets a service instance based on the type and a key.
// The key makes it possible to have multiple versions of the same service.
public T GetInstance<T>(object key = null) where T : class, TService
{
var combinedKey = new CombinedTypeKey(typeof(T), key);
// Check if we already have an instance
if (_instances.ContainsKey(combinedKey))
{
return _instances[combinedKey] as T;
}
// Create a new instance
// CompositionHost is a static reference to the DI container (and
// should perhaps be injected, however, that is not the main issue here)
var instance = CompositionHost.GetInstance<T>();
_instances.Add(combinedKey, instance);
return instance;
}
// A combined key to ease dictionary operations
private struct CombinedTypeKey
{
private readonly object _key;
private readonly Type _type;
public CombinedTypeKey(Type type, object key)
{
_type = type;
_key = key;
}
// Equals and GetHashCode() are overridden
}
}
public class ViewModelLocator : IViewModelLocator
{
private readonly ServiceLocator<IViewModel> _viewModelLocator;
public ViewModelLocator(ServiceLocator<IViewModel> locator)
{
_viewModelLocator = locator;
// Dummy code that registers design time data is removed
}
// IViewModel is just an empty interface implemented by the view models
public T GetViewModel<T>(object key = null) where T : class, IViewModel
{
return _viewModelLocator.GetInstance<T>(key);
}
}
Injecting a service locator into your classes is (almost) never the way to go, because this disallows compile time checking of dependencies and runtime dependency analysis. For that reason I can also advice to register ALL your root types (such as your views) since otherwise Simple Injector is left in the dark and is not able to advice you about any possible misconfigurations that you might have.
Since you have View + ViewModel pairs that are always cached together, but might depend on Model instance that are reused by multiple View + ViewModel pairs, I suggest the following design.
Define an abstraction for views and view models:
public interface IView<TModel>
{
IViewModel<TModel> ViewModel { get; }
}
public interface IViewModel<TModel>
{
TModel Model { get; set; }
}
Define an abstraction for retrieving/caching view by key.
public interface IViewProvider<TView, TModel> where TView : IView<TModel>
{
TView GetViewByKey(object key);
}
With these abstractions your view can look as follows:
public class FillPropertiesView : IView<FillPropertiesModel>
{
public FillPropertiesView(FillPropertiesViewModel viewModel)
{
this.ViewModel = viewModel;
}
public IViewModel<FillPropertiesModel> ViewModel { get; private set; }
}
And your controllers can depend upon the IViewProvider<TView, TModel> abstraction so they can reload the view when a new key is coming in:
public class FillPropertiesController : Controller
{
IViewProvider<FillPropertiesView, FillPropertiesModel> viewProvider;
FillPropertiesView view;
public FillPropertiesController(
IViewProvider<FillPropertiesView, FillPropertiesModel> provider) {
this.viewProvider = provider;
}
public void Reinitialize(object key) {
this.view = this.viewProvider.GetViewByKey(key);
}
}
The implementation for IViewProvider<TView, TModel> could look like this:
public class ViewProvider<TView, TModel> : IViewProvider<TView, TModel>
where TView : class, IView<TModel> {
Dictionary<object, TView> views = new Dictionary<object, TView>();
Container container;
IModelProvider<TModel> modelProvider;
public ViewProvider(Container container,
IModelProvider<TModel> modelProvider) {
this.container = container;
this.modelProvider = modelProvider;
}
public TView GetViewByKey(object key) {
TView view;
if (!this.views.TryGetValue(key, out view)) {
this.views[key] = view = this.CreateView(key);
}
return view;
}
private TView CreateView(object key) {
TView view = this.container.GetInstance<TView>();
view.ViewModel.Model = this.modelProvider.GetModelByKey(key);
return view;
}
}
This implementation depends on a (previously undefined) IModelProvider<TModel> abstraction. This is basically your old ModelLocator, but by using a generic type you can make the implementation much easier, because we can have one instance of this type per TModel (the same holds for ViewProvider), which saves you from having to do things with storing elements with the { Type + key } combination.
You can register this all as follows:
Assembly asm = Assembly.GetExecutingAssembly();
container.RegisterManyForOpenGeneric(typeof(IView<>), asm);
container.RegisterManyForOpenGeneric(typeof(IViewModel<>), asm);
container.RegisterOpenGeneric(typeof(IViewProvider<,>),
typeof(ViewProvider<,>), Lifestyle.Singleton);
container.RegisterOpenGeneric(typeof(IModelProvider<>),
typeof(ModelProvider<>), Lifestyle.Singleton);
var controllers =
from type in asm.GetTypes()
where type.IsSubClassOf(typeof(Controller))
where !type.IsAbstract
select type;
controllers.ToList().ForEach(t => container.Register(t));
container.Verify();
With RegisterManyForOpenGeneric you let Simple Injector search the supplied assemblies to look for implementations of the given open generic abstraction and Simple Injector will batch-register them for you. With RegisterOpenGeneric you specify an open-generic abstraction and tell Simple Injector which implementation to use when a close-generic version of that abstraction is requested. The last line searches through your application to look for all controller types and registers them in the system.
Related
Passing parameters to the ViewModel using a custom INavigationService Implementation?
I've built a small app using MVVM Light, and I've reached a point in which I need to pass parameters between a few different ViewModels in my app. I've explored several different options, but I'm not a huge fan of them really. The most promising I've encountered so far is simply passing messages between the ViewModels, but this is somewhat limiting as the application has the potential to have multiple of the same View open at once, and I need to isolate the parameters to a singular instance of a View/ViewModel. I'm not currently using the built in INavigationService provided by MVVM Light, but I've made one incredibly similar (and if I can solve the parameter injection, I'll likely switch). Here is a trimmed down version of my navigation service: public class NavigationService : INavigationService { /* this implementation will not allow us to have the same window open more than once. However, for this application, that should be sufficient. */ public NavigationService() { _openPages = new Dictionary<string, Window>(); } private readonly Dictionary<string, Window> _openPages; public void ClosePage(string pageKey) { if (!_openPages.ContainsKey(pageKey)) return; var window = _openPages[pageKey]; window.Close(); _openPages.Remove(pageKey); } public IEnumerable<string> OpenPages => _openPages.Keys; public void NavigateTo(string pageKey) { if (!AllPages.ContainsKey(pageKey)) throw new InvalidPageException(pageKey); // Don't re-open a window that's already open if (_openPages.ContainsKey(pageKey)) { _openPages[pageKey].Activate(); return; } var page = (Window) Activator.CreateInstance(AllPages[pageKey]); page.Show(); page.Closed += OnWindowClosedHandler; _openPages.Add(pageKey, page); } // Probably a better way to remove this. private void OnWindowClosedHandler(object sender, EventArgs args) { foreach (var item in _openPages.Where(kvp => kvp.Value == sender).ToList()) { _openPages.Remove(item.Key); } } // Reflection might work for this. // Might also consider making this more dynamic so it isn't hard-coded into my service private readonly Dictionary<string, Type> AllPages = new Dictionary<string, Type> { ["AddPatientView"] = typeof(AddPatientView), ["CheckInView"] = typeof(CheckInView), ["MainView"] = typeof(MainWindow), ["PatientLookupView"] = typeof(PatientLookupView), ["PatientDetailsView"] = typeof(PatientDetailsView) }; } Most of my ViewModels use dependency injection to wire-up other injected services, like so: public class CheckInViewModel : ViewModelBase { public CheckInViewModel(ILicenseValidationService licenseValidationService, IPatientFetchService patientFetchService, IPatientCheckInService patientCheckInService) { if (IsInDesignMode) { Title = "Find Member (Design)"; } else { Title = "Find Member"; CanFetch = true; FindMemberCommand = new RelayCommand(async () => await FindMemberHandler(), () => CanFetch); CheckInPatientCommand = new RelayCommand<Window>(async (window) => await CheckInPatientHandler(window), (window) => Patient?.PatientId != null); _licenseValidationService = licenseValidationService; _patientFetchService = patientFetchService; _patientCheckInService = patientCheckInService; } } } I would like to implement some method of injecting other parameters alongside my injected services. Has anything like this been done in a relatively straightforward way?
The way dependency injection works in almost all cases is when you resolve or getinstance a type that then will use the constructor with the most parameters in providing you with an object. If you register a concrete object against an interface ( or just a type ) then later resolve/getinstance a class which uses one of those things in it's ctor then DI provides that instance you registered. With MVVMLight you have SimpleIoc and SimpleIoc.Default is equivalent to that static service you're thinking about. There is a catch with simpleioc. It's very simple. With simpleioc once you getinstance a viewmodel of a given type then that is a singleton. You can force a different instance by passing a unique key but they're all cached. You can getinstance with parameters and maybe that replaces the current object. I'm not sure offhand. A more sophisticated DI container might be advisable. Other than that. Since you're using different windows this creates a bit of a complication in that you want to instantiate a window and that will have a datacontext you need to provide somehow with your parameters. What you could use is viewmodel first. You get inavigationservice out DI or resources or a static. You have a DoWindow(Object vm) method. When you want to navigate you presumably know the parameters for the vm. New up your viewmodel with parameters. New up a window you use for all views. Set it's content to your viewmodel. That is templated out into what you have as windows now. Except you make them usercontrols. Use Datatype="vmtype" to associate view as template with viewmodel. Bind the title of your window to Content.Title and of course add a Title property to a base viewmodel. ALternatively with a single window app you can have a contentcontrol fills the area yor views will be shown in. Bind the content of that to a currentviewmodel property and you can use viewmodel first navigation within that window.
Getting around circular dependency
Could I get help with a little issue I am encountering regarding splitting projects into different tiers. In my ViewModel logic I have code where I create a new instance of a window when a button is clicked (I use ICommand interface for that) The problem is however, that this requires my View folder which is in the presentation layer, I can’t reach it as my presentation layer is dependent on my ViewModel in the logic layer. I would just move the code that deals with the creation of the pages to the view code behind but I also pass the current instance of a viewmodel as a parameter for that new window being created (for eventhandling purposes). Any help is much appreciated! Thanks.
A view model shouldn't create instances of windows. What you could do is to inject your view model with a service that is responsible for creating windows, e.g.: public class MainWindowViewModel { private readonly IWindowService _windowService; public MainWindowViewModel(IWindowService windowService) { _windowService = windowService; CreateWindowCommand = new DelegateCommand(() => { _windowService.CreateWindow(new SomeViewModel()); }); } public ICommand CreateWindowCommand { get; } } Define the IWindowService interface in the view model project and the concrete implementation of it in the view/presentation project: public class WindowService : IWindowService { public void CreateWindow(SomeViewModel vm) { Window win = new Window(); win.DataContext = vm; win.Show(); } }
MVP view/presenter registration
I'm working on an MVP based GUI architecture for a WinForms application and would like to use Autofac to keep track of the different parts. I keep running into circular component dependencies and would appreciate a gentle push in the right direction. The architecture is based on this post where the View is as passive as i gets. The View holds no reference to the Presenter. The View is passed to the Presenter on construction. So in the non-DI world you would start your program with: var MainView = new MainView(); var mainPresenter = new MainPresenter(mainView, new DataRepository()); Application.Run(mainView); Ok, so the Presenter needs to know about the View instance to do its job. How can I express that in the registration code? This is what I've tried: builder.RegisterType<MainPresenter>().PropertiesAutowired().SingleInstance(); builder.RegisterType<MainView>().As<IMainView>().PropertiesAutowired().SingleInstance(); And then in Program.cs: var mainPresenter = Container.Resolve<MainPresenter>(); Application.Run(Container.Resolve<IMainView>() as MainView); But this way I need to remember to create the Presenter instance. However I would like to express in the registration that if I request a IMainView instance the MainPresenter should be kicked into action. But how.... Any hints, mockery or derisive laughter are welcome
I think you should be able to solve it this way: Register the presenter and view without property injection since you say the view needs no reference to the presenter, and constructor injection is considered best practice in Autofac: builder.RegisterType<MainPresenter>().SingleInstance(); builder.RegisterType<MainView>().As<IMainView>(); Inject the view into the presenter through constructor and publish it as a readonly property: public class MainPresenter { // Private variables private readonly IMainView _view; // Constructor public MainPresenter(IMainView view) { _view = view; } // Properties public IMainView View { get { return _view; } } } Then you fire up the application through a single resolve: var mainPresenter = Container.Resolve<MainPresenter>(); Application.Run(mainPresenter.View as Form); Finally, if you find later on that you need a reference from the view to the presenter, I think you would have to use property-injection on the view to avoid circular reference exceptions. Then you can register the view like this: builder.RegisterType<MainView>().As<IMainView>().PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies); and supply the view with a read/write property that will be set by Autofac public MainPresenter Presenter { get; set; }
Dependency Injection with Cyclic Dependency
Let me have two very basic objects like: public class View { public View(Controller controller) { // Use the model exposed by the controller here } } public class Controller { private readonly IView view; public Controller() { this.view = new View(this); } public Controller(View v) { this.view = v; } } Later I decide to inject View object into the Controller via DI but there I have a cyclic dependency (i.e. I can't use var ctrl = new Controller(new View(ctrl));). How would you go about injectin the dependency in this case?
The most common solution is to use a dependency property to solve circular dependencies. i.e. create a new property in one of the classes and let the IoC container assign it. If you are using Unity you should add [Dependency] to that property. A sidenote: A View should not have a dependency to a controller. It should not be aware of it at all. Update in reply to comment You can't. That's the problem with circular dependencies. The only other solution is to use composition. That is to break out the common functionality into a separate class and include it in both the controller and the view.
I actually found a nice solution using Ninject. public class Controller { private readonly View view; public Controller(ViewModule viewModule) { using (IKernel kernel = new StandardKernel(viewModule)) { this.view = kernel.Get<View>(new ConstructorArgument("controller", this); } } } Where the ViewModule is a pre-configured Ninject module to resolve the particular view dependency (GUI, CLI, etc.) Minor problem here is that, I'm now dependent on the particular DI framework.
You can't do that at all with constructor-injection If you change the constructor of the controller to public Controller(IView view) in which order would you create the two objects? View needs the controller Instance and the controller needs the view. However, you can make the IView Property of the controller public, and set the Property after creation (Some DI-Containers can do this for you automatically when you set the correct attribute).
dependency injection alternatives
I am looking at depency injection, I can see the benefits but I am having problems with the syntax it creates. I have this example public class BusinessProducts { IDataContext _dx; BusinessProducts(IDataContext dx) { _dx = dx; } public List<Product> GetProducts() { return dx.GetProducts(); } } The problem is that I don't want to write BusinessProducts bp = new BusinessProducts(dataContextImplementation); I would continue to write BusinessProducts bp = new BusinessProducts(); because I feel the first alternative just feels unatural. I dont want to know what the BusinessProduct "depends" on to get the products, also I feel it makes my code more unreadable. Is there any alternatives to this approach as I would like to keep my original syntax for creating objects but I would like to still be able to fake the dependencies when unit testing or is it this dependecy injection frameworks can do for me? I am coding in c# but alternatives from other languages is welcome
I use a factory for my context and inject it, providing a suitable default if the provided factory is null. I do this for two reasons. First, I use the data context as a unit of work scoped object so I need to be able to create them when needed, not keep one around. Second, I'm primarily using DI to increase testability, with decoupling only a secondary consideration. So my business products class would look like: public class BusinessProducts { private IDataContextFactory DataContextFactory { get; set; } // my interface public BusinessProducts() : this(null) {} public BusinessProducts( IDataContextFactory factory ) { this.DataContext = factory ?? new BusinessProductsDataContextFactory(); } public void DoSomething() { using (DataContext dc = this.DataContextFactory().CreateDataContext()) { ... } } An alternative to this would be to make the factory property publicly settable and inject an alternate factory by setting the property. Either way if you want to keep the null constructor, you'll need to provide a default.
You can create a factory. DI containers are best for wirings that happen at setup-time - not at runtime (As this looks to be a case of). Factories can be implemented in different ways, depending on how pluggable it needs to be, and how many places you need to use it.
I would usually have an empty constructor which uses a solid instance( or an instances created by IoC), amd one with DI. i.e. public class BusinessProducts { IDataContext _dx; BusinessProducts() { _dx = new SolidDataContext(); } BusinessProducts(IDataContext dx) { _dx = dx; } } This way you can use DI for overriding the default instance in unit testing testing.
Your feelings, while valid, are misplaced. The Dependency Injection pattern is a direct application of the Inversion of Control principle. This means that, instead of your class controlling the instances of other classes it consumes, that relationship is inverted and the dependencies are provided to it. As such, your classes naturally expose their dependencies via constructor arguments or properties. Showing disdain for this structure says you haven't truly grokked the pattern.
There are two distinct cases here: In production code you will never write new BusinessProducts(dataContextImplementation) because dependency injection will normally be creating the full object hierarchy for you. This is the "viral" nature of dependency injection patterns, they tend to take over full control of your service creation. In unit test code you will normally be creating this yourself, but quite often you will be supplying a mock object or a stub implementation of dataContextImplementation. So normally you will be injecting an object that does not have a large number of subsequent dependencies.
http://springframework.net/ and http://structuremap.sourceforge.net/Default.htm are probably the mostly used DI frameworks for .NET based languages and will both do what you need.
Generally the framework itself will have the logic to build up the entire object tree. For example, instead of new SomeObjectO(diContext) you would call the framework like this: DIFramework.GetNew<SomeObjectO>(); or DIFramework.Get<SomeObject>(); Another interesting framework to take a look at if you would like to learn about DI and the process is Microsoft's Unity and Object Builder projects.
If you really do not like injecting this instance in the constructor, you might try to use the CommonServiceLocator with your favourite compatible .NET depedency injection framework. This would allow you to write code like this: public class BusinessProducts { IDataContext _dx; BusinessProducts() { _dx = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IDataContext>(); } public List<Product> GetProducts() { return dx.GetProducts(); } } However, please beware that this is not what most people would expect when they know that you use a dependency injection framework. I think that it is much more common to use a dependency injection framework and letting it create all objects for you. BusinessProducts bp = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<BusinessProducts>(); If you would like to avoid the dependeny injection framework path, using a factory is probably the best way to go.
There's a technique called poor man's DI that looks like this public class BusinessProducts { IDataContext _dx; BusinessProducts() : this(new DataContext()) {} BusinessProducts(IDataContext dx) { _dx = dx; } public List<Product> GetProducts() { return dx.GetProducts(); } } This is not ideal since it ties you to the implementation but its a good stepping stone towards decoupled code. this is similar to #tvanfosson but a lot simplier. I second the recommendation for Windsor
My code will reference Microsoft Unity but I am sure it is pretty applicable to all DI frameworks. If you're using DI correctly you never need to call new BusinessObject(new dataContext) the DI association will handle it all for you. My example will be a little bit long since I will paste in some code I use for running a Model View Presenter website fully DI loaded by Unity. (If you want the full source check out my blog and download it from my Assembla SVN server) Load the container (can be in code like I prefer or using configuration) protected void Application_Start(object sender, EventArgs e) { Application.GetContainer() // presenters / controllers are per request .RegisterType<IEmployeeController, EmployeeController>(new ContextLifetimeManager<IEmployeeController>()) //Data Providers are Per session .RegisterType<IEmployeeDataProvider, EmployeeDataProvider>(new SessionLifetimeManager<IEmployeeDataProvider>()) //Session Factory is life time .RegisterType<INHibernateSessionManager, NHibernateSessionManager>(new ContainerControlledLifetimeManager()); } Custom HTTP module calls Unity BuildUp Method for each page during the OnPreRequest invocation. private static void OnPreRequestHandlerExecute(object sender, EventArgs e) { var handler = HttpContext.Current.Handler; HttpContext.Current.Application.GetContainer().BuildUp(handler.GetType(), handler); // User Controls are ready to be built up after the page initialization is complete var page = HttpContext.Current.Handler as Page; if (page != null) { page.InitComplete += OnPageInitComplete; } } Page container presenter decorated with [Dependency] attribute public partial class Employees : Page, IEmployeeView { private EmployeePresenter _presenter; [Dependency] public EmployeePresenter Presenter { set { _presenter = value; _presenter.View = this; } } } Presenter with InjectionConstructor method public class EmployeePresenter : Presenter<IEmployeeView> { private readonly IEmployeeController _controller; [InjectionConstructor] } public EmployeePresenter(IEmployeeController controller) { _controller = controller; } Controller follows suit public class EmployeeController : IEmployeeController { private readonly IEmployeeDataProvider _provider; [InjectionConstructor] public EmployeeController(IEmployeeDataProvider DataProvider) { _provider = DataProvider; } } Same with provider public class EmployeeController : IEmployeeController { private readonly IEmployeeDataProvider _provider; [InjectionConstructor] public EmployeeController(IEmployeeDataProvider DataProvider) { _provider = DataProvider; } } Lastly the session manager, which contains only a regular constructor. public class NHibernateSessionManager : INHibernateSessionManager { private readonly ISessionFactory _sessionFactory; public NHibernateSessionManager() { _sessionFactory = GetSessionFactory(); } } So what happens when a page request is started the BuildUp() method is called on the page by the HttpModule. Unity then sees the Property marked with the Dependency attribute and will check it's container to see if inside it exists an EmployeePresenter object. Since there is no such object in the container it will then try to create an EmployeePresenter. Upon inspection to create the class it sees inside the Presenter it requires a constructor that needs a IEmployeeController injected into it. Since the container actually has a manager for the controller it will see if an instance of it exists in the container which on the beginning of the page request doesn't exist, so it will go to instantiate the controller. Unity will then see the controller requires a IEmployeeDataProvider injected into it, and it will continue on this process until it finally gets to the point where the Provider needs the session manager injected. Since the session manager has no more need for injection Unity will then create an instance of the session manager store it in the container for it's given ContainerLifeTimeManager, inject it into the Provider and store that instance, and so on down to where it finished creating a EmployeePresenter dependency for the page.
you can also look at windsor for IoC .