模型的 Unity 依赖注入
Unity dependency injection for Models
我刚开始将 Unity 与 MVC 结合使用,我 运行 在我看来,有点代码重复。考虑以下 Controller/Model 模式:
控制器:
public class MyController : Controller {
private readonly IDependency1 _dependency1;
private readonly IDependency2 _dependency2;
private readonly IDependency3 _dependency3;
public MyController(
IDependency1 dependency1,
IDependency2 dependency2,
IDependency3 dependency3
) {
}
public ActionResult Thingy() {
var model = new Thingy(_dependency1, _dependency2, _dependency3);
model.DoLogic();
model.SetUpView();
model.Finalize();
return View(model);
}
}
型号:
public class Thingy {
private readonly IDependency1 _dependency1;
private readonly IDependency2 _dependency2;
private readonly IDependency3 _dependency3;
public Thingy(
IDependency1 dependency1,
IDependency2 dependency2,
IDependency3 dependency3
) {
}
// Now I can use my dependencies
}
这允许我实现瘦 controllers/fat 模型,但是我现在在控制器和模型中复制依赖关系。
我看到我可以在我的模型中使用属性:
public class Thingy {
[Dependency]
public IDependency1 Dependency1 { private get; set; };
[Dependency]
public IDependency2 Dependency2 { private get; set; };
[Dependency]
public IDependency3 Dependency3 { private get; set; };
}
然后像这样在我的操作中初始化我的模型:
public ActionResult Thingy() {
// No need to pass in via constructor
var model = DependencyResolver.Current.GetService<Thingy>();
}
从编码 POV 看,不错而且精益求精,但我读到这是一种反模式?
问:为什么这被认为是反模式,我可以修改我的结构以防止代码重复吗?
是的,这是反模式。原因之一 - 过多的关联代码。如果要替换 IoC 容器(例如 NInject),则必须更改控制器和模型的代码。它违反了 Open/closed 原则 (http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))。此外,您将很难对控制器进行单元测试。
我刚开始将 Unity 与 MVC 结合使用,我 运行 在我看来,有点代码重复。考虑以下 Controller/Model 模式:
控制器:
public class MyController : Controller {
private readonly IDependency1 _dependency1;
private readonly IDependency2 _dependency2;
private readonly IDependency3 _dependency3;
public MyController(
IDependency1 dependency1,
IDependency2 dependency2,
IDependency3 dependency3
) {
}
public ActionResult Thingy() {
var model = new Thingy(_dependency1, _dependency2, _dependency3);
model.DoLogic();
model.SetUpView();
model.Finalize();
return View(model);
}
}
型号:
public class Thingy {
private readonly IDependency1 _dependency1;
private readonly IDependency2 _dependency2;
private readonly IDependency3 _dependency3;
public Thingy(
IDependency1 dependency1,
IDependency2 dependency2,
IDependency3 dependency3
) {
}
// Now I can use my dependencies
}
这允许我实现瘦 controllers/fat 模型,但是我现在在控制器和模型中复制依赖关系。
我看到我可以在我的模型中使用属性:
public class Thingy {
[Dependency]
public IDependency1 Dependency1 { private get; set; };
[Dependency]
public IDependency2 Dependency2 { private get; set; };
[Dependency]
public IDependency3 Dependency3 { private get; set; };
}
然后像这样在我的操作中初始化我的模型:
public ActionResult Thingy() {
// No need to pass in via constructor
var model = DependencyResolver.Current.GetService<Thingy>();
}
从编码 POV 看,不错而且精益求精,但我读到这是一种反模式?
问:为什么这被认为是反模式,我可以修改我的结构以防止代码重复吗?
是的,这是反模式。原因之一 - 过多的关联代码。如果要替换 IoC 容器(例如 NInject),则必须更改控制器和模型的代码。它违反了 Open/closed 原则 (http://en.wikipedia.org/wiki/SOLID_(object-oriented_design))。此外,您将很难对控制器进行单元测试。