问题:有没有办法使用 Ninject 将依赖项注入(inject)我的 MVC 模型?
首先,我是 MVC 和 DI(以及 stackoverflow,顺便说一句)的新手,所以我想确保我在解决这个问题时走上了正确的道路。几天来我一直在谷歌上搜索答案,但找不到清晰的解释...我使用的是 C#、.NET4、MVC3、Ninject 和 VS2010。
场景如下:我有一个新的用户表单,用户可以在其中设置他们的登录名、角色和其他配置文件数据。提交后,我需要将登录信息保存到 MembershipProvider,将角色保存到 RoleProvider 等......它变得有点毛茸茸,因为我根据我的项目要求使用双供应商(Active Directory/本地数据库),因此,在确定要保存到哪个提供者、用户是否已经存在、是否允许他们 self 识别任何角色等方面有一些逻辑。
我觉得这个逻辑应该放在我模型的 .Save() 方法中。 但是,我随后需要将提供程序的实例注入(inject)到我的模型中,而 Ninject 似乎不注入(inject)模型(至少不使用 NuGet 包附带的默认设置)。因此我最初的问题。
我可以想到一些替代方案...
- 也许模型不适合作为此逻辑的起点,我应该将逻辑抽象为服务吗?但是只为这个保存功能提供服务对我来说似乎有点过分了。
- 我可以吃我的 Controller 中的膨胀...但我被告知“胖” Controller 是一种不好的做法。
- 我想我可以改为将我的提供程序注入(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/