【发布时间】:2015-01-23 01:00:40
【问题描述】:
我刚刚开始将 Unity 与 MVC 结合使用,但我遇到了一些代码重复问题。考虑以下控制器/模型模式:
控制器:
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
}
这允许我实现瘦控制器/胖模型,但是我现在在控制器和模型中复制依赖项。
我看到我可以在我的模型中使用属性:
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 来看不错且精益求精,但我读到这是一种反模式?
问:为什么这被认为是一种反模式,我可以修改我的结构以防止代码重复吗?
【问题讨论】:
-
你为什么想要一个胖模特?你真的认为你的模型应该知道视图吗?这个模型可以用于网络/移动/嵌入式(一般重复使用)吗?控制器不应该是做“思考”和安排事情的人吗?视图应该显示数据。模型就是数据?
-
这里的反模式是您的模型包含依赖项。模型应该是普通的旧 DTO;只是数据,没有行为。您应该只将数据对象返回给视图,因为无法(轻松)测试视图,并且将逻辑移入模型会增加复杂性。
-
我明白了,这是有道理的 - 多亏了两者 - 我将重构控制器 :)
标签: c# asp.net-mvc dependency-injection unity-container