【问题标题】:.NET MVC Dependency Injection on Models?.NET MVC 依赖注入模型?
【发布时间】:2011-06-23 23:00:12
【问题描述】:

问题:有没有办法使用 Ninject 将依赖项注入到我的 MVC 模型中?

首先,我是 MVC 和 DI(以及 stackoverflow,顺便说一句)的新手,所以我想确保我在解决这个问题时走的是正确的道路。几天来我一直在谷歌上搜索答案,但找不到一个清晰的解释……我正在使用 C#、.NET4、MVC3、Ninject 和 VS2010。

场景如下:我有一个新的用户表单,用户可以在其中设置他们的登录名、角色和其他个人资料数据。提交后,我需要将登录信息保存到 MembershipProvider,将角色保存到 RoleProvider 等...它有点麻烦,因为我根据项目要求使用双提供者(Active Directory / 本地数据库),因此,在确定要保存到哪个提供者、用户是否已经存在、是否允许他们自我识别任何角色等方面存在一些逻辑。

我觉得这个逻辑应该放在我模型的 .Save() 方法中。 但是,我需要将提供程序的实例注入到我的模型中,而 Ninject 似乎没有注入模型(至少不使用 NuGet 包附带的默认设置)。因此,我最初的问题。

我能想到一些替代方案...

  1. 也许模型不适合开始此逻辑,我应该将逻辑抽象为服务?但是为这个保存功能提供服务对我来说似乎有点过头了。
  2. 我可以只吃控制器中的膨胀...但我被告知“胖”控制器是一种不好的做法。
  3. 我想我可以改为将我的提供程序注入到我的控制器中,然后将这些依赖项传递给我的模型,但这似乎有点不靠谱。

所以... 有没有办法对模型进行 Ninject 或者我是否需要重新考虑,因为我是这方面的新手?

【问题讨论】:

  • 什么意思 ninject 似乎没有注入模型?注入 INTO 模型?你的会员是公开的吗?
  • @DustinDavis - 是的,我的意思是 INTO 模型,我的模型和构造函数是公开的。在任何地方调用它们时,我仍然必须指定构造函数参数,而且我的视图仍然抱怨需要无参数构造函数,所以看起来 Ninject 不适用于我的模型。

标签: c# asp.net-mvc-3 ninject


【解决方案1】:

我会选择选项一。这并不过分——添加一个类和一个接口只是几行代码,它可以让你的实现保持整洁,也许以后你会想要添加更多方法......更新用户?

添加一个接口和类来处理你的控制器使用的这个 - ninject 会为你获取这个实例。我写了IMembershipAndRoleService作为例子。

public interface IMembershipAndRoleService
{
    void ProcessNewUser(User newUser);
}

public class YourController : Controller
{
    private readonly IMembershipAndRoleService _membershipAndRoleService;

    public YourController(IMembershipAndRoleService membershipAndRoleService)
    {
        _membershipAndRoleService = membershipAndRoleService;
    }

    [HttpPost]
    public ActionResult NewUserFormAction(NewUserForm newUserForm)
    {
        //process posted form, possibly map / convert it to User then call to save
        _membershipAndRoleService.ProcessNewUser(user);
        //redirect or return view
    }
}

最后创建实现 IMembershipAndRoleService 的类,该类将使用您的成员资格和角色提供者或其他接口,从而简化您在该类中的逻辑。

【讨论】:

  • 我想我知道这是正确的答案...也许我只是需要听到它:)
【解决方案2】:

如果您使用的是 NuGet 中的 Ninject.MVC 包,它将挂接到 MVC DependencyResolver,因此您可以这样做以获取 Ninject 注入的模型实例。

var model = System.Web.Mvc.DependencyResolver.Current.GetService<MyModel>();

服务架构可能是设计应用程序的更好方法,但是对于“为什么我的模型没有被注入”这样简单的问题,这是因为您需要通过依赖注入容器来创建它,而不是通过 new ()。

【讨论】:

  • 谢谢。听起来服务方法就是答案,但是感谢您的花絮-以后可能会有用。我会在获得代表后立即投票给你。
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
相关资源
最近更新 更多