使用IoC来解析动作方法中的模型对象
本文关键字:方法 模型 对象 IoC 使用 | 更新日期: 2023-09-27 18:19:02
我在Asp中使用IoC容器进行依赖注入。Net MVC 3和一切似乎都很完美,直到我开始在我的控制器中编写动作方法。在动作方法中创建实体/模型对象的最佳方法是什么?有时,模型是从特定的存储库或服务中检索的,这些存储库或服务通过构造函数注入到控制器中,但对于系统中的许多其他模型对象来说,情况并非如此。
IOC容器最适合用于创建组件;但它不应该用于创建模型对象。例如,good:
public ActionResult SignUp(string username, string password)
{
var user = new User(); // Your model object
user.Username = username; //...
_repository.Save(user);
return Redirect(...);
}
模型对象本身不应该有任何依赖关系,所以它不需要从IOC容器中解析。这同样适用于视图模型:
public ActionResult Show(int userId)
{
var user = _repository.Load<User>(userId);
var model = new ShowUserModel(user);
return View(model);
}
创建后,模型/视图模型应该是有效只读的,所以它需要的任何信息都应该通过控制器传递进来——它不应该接受注入的依赖项。
如果你真的,真的需要在动作中动态创建组件,你可以这样做:
class HomeController : Controller
{
readonly Func<IFooService> _fooServiceFactory;
public HomeController(Func<IFooService> fooServiceFactory)
{
_fooServiceFactory = fooServiceFactory;
}
public ActionResult SomeAction()
{
var service = _fooServiceFactory(); // Resolves IFooService dynamically
service.DoStuff();
}
}
任何像样的IOC容器都应该能够处理Func<T>
注入。
不使用DI容器来解析操作参数。这就是模型绑定器在ASP中要做的事情。净MVC。顺便说一下,您的操作应该采用任何域模型作为参数=>它们应该只采用视图模型。视图模型是专门为满足给定视图的需求而定义的类。
因此,对于某些特定的情况,您可以编写一个自定义模型绑定器,它将负责实例化和绑定您的操作参数。就模型绑定器本身的实例化而言,在ASP中。. NET MVC 3中,你可以使用依赖解析器,它可以通过你选择的DI框架将依赖注入到模型绑定器中。