模型上的.NET MVC依赖注入?

jri*_*zzo 16 c# ninject asp.net-mvc-3

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

首先,我是MVC和DI(以及stackoverflow,btw)的新手,所以我想确保我正在走这条问题的正确道路.几天来我一直在谷歌搜索答案,但我找不到一个干净的解释......我正在使用C#,. NET4,MVC3,Ninject和VS2010.

这是一个场景:我有一个新的用户表单,用户可以在其中设置登录,角色和设置其他配置文件数据.当这个提交时,我需要将登录信息保存到MembershipProvider,RoleProvider的角色等等......它有点毛茸茸,因为我根据我的项目要求使用双提供程序(Active Directory /本地数据库),因此,在确定要保存到哪个提供程序时,如果用户已经存在,是否允许自我识别任何角色,还有一些逻辑,等等.

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

我可以想到一些替代方案......

  1. 也许模型对于这个逻辑来说是一个不好的地方,我应该将逻辑抽象为服务?但是为这个保存功能提供服务对我来说似乎有些过分.
  2. 我可以在我的控制器中吃掉臃肿......但我被告知"胖"控制器是一种不好的做法.
  3. 我想我可以将我的提供程序注入我的控制器,然后将这些依赖项传递给我的模型,但这看起来有点不稳定.

那么...... 有没有办法让Ninject模型或者我需要重新考虑因为我是新手吗?

CRi*_*ice 11

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

添加一个接口和类来处理控制器使用的--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
    }
}
Run Code Online (Sandbox Code Playgroud)

最后创建实现IMembershipAndRoleService的类,此类将使用您的Membership和Role提供程序或其他接口,这样可以简化此类中的逻辑.


Chr*_*nty 5

如果您正在使用NuGet的Ninject.MVC包,它将挂钩到MVC DependencyResolver,因此您可以执行此操作以获取Ninject注入的模型实例.

var model = System.Web.Mvc.DependencyResolver.Current.GetService<MyModel>();
Run Code Online (Sandbox Code Playgroud)

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