使用IoC来解析动作方法中的模型对象

本文关键字:方法 模型 对象 IoC 使用 | 更新日期: 2023-09-27 18:19:02

我在Asp中使用IoC容器进行依赖注入。Net MVC 3和一切似乎都很完美,直到我开始在我的控制器中编写动作方法。在动作方法中创建实体/模型对象的最佳方法是什么?有时,模型是从特定的存储库或服务中检索的,这些存储库或服务通过构造函数注入到控制器中,但对于系统中的许多其他模型对象来说,情况并非如此。

使用IoC来解析动作方法中的模型对象

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框架将依赖注入到模型绑定器中。