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