I have an ASP.NET page that implements my view and creates the presenter in the page constuctor. Phil Haack's post providing was used as the starting point , and I'll just the examples from the post to illustrate the question.
public partial class _Default : System.Web.UI.Page, IPostEditView {
PostEditController controller;
public _Default()
{
this.controller = new PostEditController(this, new BlogDataService());
}
}
What is the best approach to inject the instance of the BlogDataService? The examples I have found use properties in the Page class for the dependency marked with an attribute which the injection framework resolves.
However, I prefer using the constructor approach for testing purposes.
Does anyone have input or perhaps links to good implementations of the above. I would prefer Ninject, but StructureMap or Windsor would be fine as long as its fluent.
Thanks for any feedback.
In our homegrown MVP-framework we had a typed base-class that all Pages inherited from. The type needed to be of type Presenter (our base presenter class)
In the base-class we then initialized the controller using the IoC-container.
Sample code:
public class EditPage : BasePage<EditController> {
}
public class EditController : Presenter {
public EditController(IService service) { }
}
public class BasePage<T> : Page where T: Presenter
{
T Presenter { get; set; }
public BasePage() {
Presenter = ObjectFactory.GetInstance<T>(); //StructureMap
}
}
Hope this helps!
If you use the Microsoft ServiceLocator , you can apply the service locator design pattern and ask the container for the service.
In your case it would look something like this:
public partial class _Default : System.Web.UI.Page, IPostEditView {
PostEditController controller;
public _Default()
{
var service = ServiceLocator.Current.GetInstance<IBlogDataService>();
this.controller = new PostEditController(this, service);
}
}
ServiceLocator has implementations for Castle Windsor and StructureMap. Not sure about Ninject, but it's trivial to create a ServiceLocator adapter for a new IoC.
I haven't seen a general purpose method for doing constructor injection on webforms. I assume it may be possible via a PageFactory implementation, but since most on the edge right now are moving to MVC rather than webforms, that may not happen.
However, autofac (a DI container I like a lot) has an integration module for ASP.NET WebForms that does property injection without attributes - your code would look like this :
public partial class _Default : System.Web.UI.Page, IPostEditView {
public IBlogDataService DataService{get;set;}
public _Default()
{
}
}
I know this doesn't specifically solve your desire to use constructor injection, but this is the closest I know of.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.