gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:05:24 25 4
gpt4 key购买 nike

我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com