我在我的 mvc 3 应用程序中使用 Ninject 的工作单元模式。我遇到了一个问题,如果不使用某种新的或服务位置,我很难解决它。
我正在使用一个名为 MyModel
的抽象基本模型,它有 2 个具体子类 MyModel1
和 MyModel2
。这些需要根据用户记录中设置的值发送到 View 。
public class MyController : Controller
{
private IUnitOfWork _unitOfWork;
public MyController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; }
...
public ActionResult MyMethod() {
var user = _unitOfWork.Get(user)
if (user.myprop == somevalue)
{
return View(new MyModel1());
}
return View(new MyModel2());
}
这工作得很好(虽然我不喜欢它,但它很简单并且有效。问题是在使用依赖注入(inject)时使用 new 是一种反模式。此外,我现在希望模型能够初始化自身(从数据库)所以我需要将 IUnitOfWork
注入(inject)到模型的构造函数中。我当然可以这样做:
if (user.myprop == somevalue)
{
return View(DependancyResolver.Current.GetService(typeof(MyModel1)));
}
但是服务位置也是一种反模式。
关于如何解决这个问题有什么建议吗?
最佳答案
如果使用正确,使用 new 并不是 DI 的反模式。使用new来创建 View 模型等数据容器是绝对没有问题的。
但对于 MVC 应用程序来说,在 View 模型中包含逻辑或数据检索代码是一种反模式,因此它们需要依赖项。所有这些东西都属于 Controller 或某些服务的外部。数据从外部分配给 View 模型并进行预格式化。
关于c# - 根据其他值获取对象实例,而不使用服务位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7261472/