Jef*_*ger 8 ninject ioc-container ninject-2
我有一种情况,我想依赖注入我的用户对象,但也将当前用户放在IoC容器中.我想要以下几行:
kernel.Get<User>(); // Should return a new User()
kernel.Get<User>("Current"); // Should return the current user
Run Code Online (Sandbox Code Playgroud)
有人可能认为像这样的绑定会起作用:
Bind<User>().ToSelf();
Bind<User>().ToMethod(LoadCurrentUser).InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)
当然,这给了:
Ninject.ActivationException: Error activating User More than one matching bindings are available. Activation path: 1) Request for User Suggestions: 1) Ensure that you have defined a binding for User only once.
我理解错误,因为命名绑定不限制该绑定的应用程序,因此两个绑定都适用.很明显,我需要使用.When*()方法的上下文绑定,但我无法想出任何方法来做到这一点.我觉得应该有什么方法可以检测是否应用了命名实例.就像是:
// Not valid Ninject syntax
Bind<User>().ToSelf().WhenUnnamedRequested();
Bind<User>().ToMethod(LoadCurrentUser).WhenNamedRequested().InRequestScope().Named("Current");
Run Code Online (Sandbox Code Playgroud)
我找不到IRequest界面上的任何地方或它的属性告诉我要求的名称.我该怎么做呢?
这个问题已在邮件列表上得到解答: http://groups.google.com/group/ninject/browse_thread/thread/cd95847dc4dcfc9d ?hl=en
如果您通过调用内核上的 Get 来访问用户(我希望您不要这样做),那么也为第一个绑定指定一个名称,并始终按名称访问用户。实际上,有一种方法可以从没有名称的绑定中获取实例。但因为我衷心建议不要这样做,所以我不会在这里展示如何做到这一点。如果您仍然想这样做,我稍后会告诉您这是如何工作的。
如果您采用更好且更喜欢的方式来执行此操作,并将用户注入到需要它作为依赖项的对象中,则有两种选择:
或者保持实现类不受 IoC 框架影响的首选方法:指定自定义属性并将它们添加到参数中,例如 ctor([NewUser] IUser newUser, [CurrentUser]IUser currentUser)。将绑定更改为:
Bind<User>().ToSelf()
.WhenTargetHas<NewUserAttribute>();
Bind<User>().ToMethod(LoadCurrentUser)
.InRequestScope()
.WhenTargetHas<CurrentUserAttribute>();
Run Code Online (Sandbox Code Playgroud)