我有一个ASP.NET页面,它实现了我的视图,并在页面构造器中创建了演示者。 Phil Haack's post providing was used as the starting point,我只是帖子中的例子来说明问题。
public partial class _Default : System.Web.UI.Page, IPostEditView {
PostEditController controller;
public _Default()
{
this.controller = new PostEditController(this, new BlogDataService());
}
}
注入BlogDataService实例的最佳方法是什么?我发现的示例使用Page类中的属性来标记注入框架解析的属性。
但是,我更喜欢使用构造函数方法进行测试。
是否有人有输入或可能链接到上述的良好实现。我更喜欢Ninject,但只要它流利,StructureMap或Windsor就可以了。
感谢您的反馈。
答案 0 :(得分:2)
在我们自己开发的MVP框架中,我们有一个所有Pages继承自的类型化基类。类型必须是Presenter类型(我们的基本演示者类)
在基类中,我们使用IoC容器初始化控制器。
示例代码:
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
}
}
希望这有帮助!
答案 1 :(得分:1)
如果您使用Microsoft ServiceLocator,则可以应用service locator design pattern并向容器询问服务。
在你的情况下,它看起来像这样:
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具有Castle Windsor和StructureMap的实现。不确定Ninject,但为新的IoC创建ServiceLocator适配器是微不足道的。
答案 2 :(得分:1)
我还没有看到在webforms上进行构造函数注入的通用方法。我假设它可能通过PageFactory实现,但由于现在大多数人正在转向MVC而不是webforms,这可能不会发生。
然而,autofac(我喜欢的DI容器)有一个integration module for ASP.NET WebForms,它可以在没有属性的情况下进行属性注入 - 你的代码看起来像这样:
public partial class _Default : System.Web.UI.Page, IPostEditView {
public IBlogDataService DataService{get;set;}
public _Default()
{
}
}
我知道这并没有特别解决你使用构造函数注入的愿望,但这是我所知道的最接近的。