c# - .NET MVC 对模型的依赖注入(inject)?

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

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

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

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

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

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

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

那么... 有没有办法注入(inject)模型,或者我是否需要重构,因为我是这方面的新手?

最佳答案

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

添加一个接口(interface)和类来处理您的 Controller 使用的这个 - 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 的类,该类将使用您的成员身份和角色提供者或其他接口(interface),从而简化您在该类中的逻辑。

关于c# - .NET MVC 对模型的依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6461601/

相关文章:

C#字符串转句子

c# - ViewBag、viewdata 和模型属性

javascript - 如何防止必填字段的 MVC 非侵入式验证也激活电子邮件验证?

.net - 在 Ninject 中将单例绑定(bind)到多个服务

asp.net - Ninject、ASP.NET 和自定义控件

asp.net-mvc - ASP.NET MVC 2、Ninject 2.2 并且没有为此对象定义无参数构造函数

c# - 我可以查询 mysql DB 但无法保存对其的更改

c# - Razor 安全检查无效的表达式术语

c# - 常见 Linq 表达式的示例

c# - Html.CheckBox 返回值不正确/错误