tra*_*max 10 .net c# 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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意到注释的代码行?
我确实将活页夹注册Global.asax
为
ModelBinders.Binders[typeof(User)] = new UserModelBinder();
Run Code Online (Sandbox Code Playgroud)
所以我不能真正通过施工注射.
UserDataService
有一连串的依赖:UserDataService -> UserRepository -> Context
.所以在这里使用Ninject会很好.
问题是,当我取消注释[Inject]
上面的userData
声明,并尝试让Ninject注入对象作为参数时,它由于某种原因不起作用:我得到空引用异常.
(可能是UserDataService
没有接口,我将对象绑定到自身:kernel.Bind<UserDataService>().ToSelf();
??)
我在代码中有另一个注释行:
userDataService = DependencyResolver.Current
.GetService<UserDataService>();
Run Code Online (Sandbox Code Playgroud)
如果取消注释,设置工作,我会插入正确的对象,但现在我们依赖DependencyResolver,这并不比说 userDataService = new UserDataService()
我错过了什么吗?是否有另一种方法将对象作为参数注入,而不是引入对Ninject或DependencyResolver的依赖?
您可以这样做:
public class UserModelBinder : IModelBinder
{
public Func<UserDataService> UserData { get; set; }
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Guid UserID = (Guid)Membership.GetUser().ProviderUserKey;
User u = UserData().GetUser(UserID);
return u;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当您将其连接时:
ModelBinders.Binders[typeof(User)] = new UserModelBinder()
{
userData = () => DependencyResolver.Current.GetService<UserDataService>();
}
Run Code Online (Sandbox Code Playgroud)
好处是您UserModelBinder
不知道正在使用容器,而仍可打开进行注射。
但是我同意史蒂文 -为此使用模型绑定器似乎不太正确。相反,您可以将注入ICurrentUserContext
到您的控制器中,其中实现将返回当前用户。然后,您甚至无需在控制器操作中添加参数。