【发布时间】:2015-05-15 02:17:39
【问题描述】:
我有以下类和接口结构,我很难让代码做我需要的事情。
public interface IUserManager
{
int Add(User user);
}
public class UserManagerA : IUserManager{}
public class UserManagerB : IUserManager{}
在此示例中,我使用 Ninject 作为 IoC 容器,但如果其他容器解决了问题,我愿意更改它:
这是在我的NinjectWebCommon.cs:
void RegisterServices(IKernel kernel)
{
string userRole = CurrentUser.Role;//this gets the user logged in
//This is the part I do not how to do
//I wish I could just type this in:
kernel.Bind<IUserManager>().To<UserManagerA>()
.When(userRole == "RoleA"); // this doesn't work obviously
kernel.Bind<IUserManager>().To<UserManagerB>()
.When(userRole == "RoleB"); // same doesn't work
}
所有这些,以便在我的 (MVC) 控制器中我可以做到这一点:
public class UserController
{
private readonly IUserManager _userManager;
public UserController(IUserManager userManager)
{
_userManager = userManager;
}
public ActionResult Add(User user)
{
//this would call the correct manager
//based on the userRole
_userManager.Add(user);
}
}
我一直在阅读有关抽象工厂的文章,但还没有找到一篇解释如何将工厂与 IoC 容器集成并传递在运行时获得的参数来解析实现的文章。
【问题讨论】:
-
.When(r => CurrentUser.Role == "RoleA");? - 假设When是根据您不想在设置期间捕获值的每个分辨率计算... -
@AlexeiLevenkov 我不确定你的意思是什么?
CurrentUser是从登录的用户计算出来的,因此值会在每次请求时发生变化,Ninjects 绑定不是在每次创建控制器时都会发生吗? -
我不知道 Ninject 是如何工作的,我的建议是基于 Unity 的行为方式。我假设 Ninject 会在每次需要解析类型时执行
.When并且默认解析频率(在 Unity 中也称为“生命周期”)是每次请求类型时......这样当控制器创建时(至少每个 http请求)它将得到IUserMamager匹配CurrentUser.Role....(可能完全关闭,因为我对Ninject没有直接的了解) -
@AlexeiLevenkov 好的,谢谢,我会先尝试使用 ninject 如果它不起作用我会尝试统一。
标签: c# asp.net-mvc dependency-injection ioc-container abstract-factory