【发布时间】:2014-04-08 14:44:10
【问题描述】:
我有一个演示者来处理我的表单的行为,如下所示:
public class Form1Presenter
{
IForm1View _view;
IUnitOfWork _unitOfWork;
IService1 _service1;
IService2 _service;
public Form1Presenter(
IForm1View view,
IUnitOfWork unitOfWork,
IService1 service1,
IService2 service2)
{
_view = view;
_unitOfWork = unitOfWork;
_service1 = service1;
_service2 = service2;
}
}
服务被注入了与上面的演示者相同的工作对象单元。像这样:
public class Service1 : IService1
{
IUnitOfWork _unitOfWork;
public Service1(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
}
要手动创建 Form1Presenter,我必须这样做:
public class Form1 : Form, IForm1View
{
public Form1()
{
IUnitOfWork unitOfWork = new UnitOfWork();
IService1 service1 = new Service1(unitOfWork);
IService1 service2 = new Service2(unitOfWork);
Form1Presenter presenter = new Form1Presenter(this, unitOfWork, service1, service2);
}
}
Ninject 有什么好的方法吗?我是新手,似乎无法解决。
【问题讨论】:
-
您必须使用作用域来确保
service1、service2和Form1Presenter被注入相同的IUnitOfWork实例。另外,您的IUnitOfWork的生命周期(管理)是多少? -
是的,示波器听起来像我需要的东西。为每个表单创建一个新的 IUnitOfWork 实例。
-
This is an interesting article。如果我正在编写网页代码,我会使用 InRequestScope。激活块似乎可以解决问题,但它会污染我的代码,因为我希望将这些细节限制在组合根中。
-
不要(永远)使用
ActivationBlock,它将从 ninject 中删除,并且还有一些其他副作用很多。 -
感谢您对 ActivationBlock 的提醒。就像我说的,我是 Ninject 的新手。
标签: c# winforms ninject inversion-of-control mvp