有没有办法进行绑定,可以说“当将IService注入区域内的任何控制器时,Admin会注入此实例”?
我们在Admin中有许多可能使用相同服务的控制器。我们可以为每个控制器编写绑定,但随后可能会引入另一个控制器和相同的服务,并且开发人员忘记专门为Admin(它使用与其他区域或区域外的不同服务实现集合)进行连接。
// this is the default
kernel.Bind<ICategorizationRepository<DirectoryCategory>>().To<CachedJsonCategorizationProvider<DirectoryCategory>>().InRequestScope();
// Admin bindings use noncaching repositories
kernel.Bind<ICategorizationRepository<DirectoryCategory>>().To<JsonCategorizationProvider<DirectoryCategory>>().WhenInjectedInto<Areas.Admin.Controllers.DirectoryCategorizationController>().InRequestScope();
kernel.Bind<ICategorizationRepository<DirectoryCategory>>().To<JsonCategorizationProvider<DirectoryCategory>>().WhenInjectedInto<Areas.Admin.Controllers.DirectoryEntryController>().InRequestScope();
// .. new controller that uses ICategorizationRepo might be created but the developer forgets to wire it up to the non caching repository - so the default one will be used, which is undesirable
我想说:在管理区域内注入任何内容时,请使用此...
答案 0 :(得分:2)
条件时自己写。
.When(request => request.Target.Member.ReflectedType is a controller in the area namespace)
@mare更新:
我将更新您的答案,详细说明我是如何解决的。你确实指出了我正确的方向,很容易从你的答案得到正确的解决方案。这就是我所做的:
// custom when condition
Func<IRequest, bool> adminAreaRequest = new Func<IRequest, bool>(r => r.Target.Member.ReflectedType.FullName.Contains("Areas.Admin"));
kernel.Bind<ICategorizationRepository<DirectoryCategory>>).To<JsonCategorizationProvider<DirectoryCategory>>().When(adminAreaRequest).InRequestScope();
由于我的所有控制器都在xyz.Areas.Admin命名空间中,因此FullName始终包含该字符串。我是否需要另一个自定义请求,我可以轻松地创建它,就像我对此做的那样。