c# - 在 ASP.NET MVC3 模型绑定(bind)器中使用依赖注入(inject)

标签 c# .net asp.net-mvc dependency-injection ninject

我正在 MVC3 网站上工作,尝试使用 Ninject 来解决我的依赖关系。我有以下场景:

public class UserModelBinder : IModelBinder
{
    //[Inject]
    public UserDataService userData { get; set; }

    public object BindModel(
        ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        Guid UserID =
            (Guid)Membership.GetUser().ProviderUserKey;

        //userDataService = DependencyResolver.Current
        //    .GetService<UserDataService>();

        User user = userDataService.GetUser(UserID);

        return user;
    }
}

注意到注释的代码行了吗?

我确实在 Global.asax 中注册了 Binder 作为

ModelBinders.Binders[typeof(User)] = new UserModelBinder();

所以我真的不能通过构造来做注入(inject)。

UserDataService有一个依赖链:UserDataService -> UserRepository -> Context .所以在这里使用 Ninject 会很好。

问题是,当我取消注释 [Inject] 时以上userData声明,并尝试让 Ninject 将对象作为参数注入(inject),但由于某种原因它不起作用:我得到空引用异常。

(可能是 UserDataService 没有接口(interface),我将对象绑定(bind)到自身:kernel.Bind<UserDataService>().ToSelf(); ??)

我在代码中有另一个注释行:

userDataService = DependencyResolver.Current
    .GetService<UserDataService>();

当取消注释时,设置有效,我插入了正确的对象,但现在我们依赖于 DependencyResolver,这并不比说 userDataService = new UserDataService() 好多少。

我错过了什么吗?有没有另一种方法可以将对象作为参数注入(inject)而不引入对 Ninject 或 DependencyResolver 的依赖?

最佳答案

模型绑定(bind)器应该只做数据转换,不应该依赖于任何服务,当然也不会触发任何数据库通信。这应该在您的应用程序的另一部分完成。你的 Action 方法应该只接受一个 Guid userId 并且你应该从你的 Controller 中调用 userDataService.GetUser(UserID); (或者在较低的层中,例如,在business command)。通过这样做,您的问题将不存在。

关于c# - 在 ASP.NET MVC3 模型绑定(bind)器中使用依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10848560/

相关文章:

c# - YUI AJAX 和 .Net MVC

c# - 检查表单是否具有焦点或处于事件状态

c# - 在 Windows 窗体应用程序中调整控件位置

c# - GAC 对象的配置文件

c# - 从 IQueryable<String> 到 String

c# - 使用 View 名称与完整路径调用部分 View

c# - 两张表格,一页。查看模型、模型还是其他?

.net - 从 C++ 中的 .Net TextBox 获取 double 值

c# - ASP.NET MVC 3 可嵌入博客引擎

c# - 使用 Exchange 服务和 OAuth 订阅推送通知时出现 401 Unauthorized