0

有没有办法制作一个绑定,上面写着“当将 IService 注入区域内的任何控制器时,管理员注入此实例”?

我们在 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

我想说:在管理区域内注入任何内容时,请使用此...

4

1 回答 1

2

写你自己的when条件。

.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 始终包含该字符串。如果我需要另一个自定义请求,我可以像处理这个请求一样轻松创建它。

于 2012-05-20T21:09:54.200 回答