gpt4 book ai didi

c# - 抽象工厂和控制反转在运行时解析

转载 作者:太空狗 更新时间:2023-10-30 00:40:18 25 4
gpt4 key购买 nike

我有以下类和接口(interface)结构,但我很难尝试让代码执行我需要的操作。

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) Controller 中我可以这样做:

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 容器集成并传递在运行时获取的参数以解析实现的文章。

最佳答案

创建一个负责提供正确的 UserManager 的类并将其注入(inject)您的 Controller :

public class UserManagerProvider : IUserManagerProvider
{
private readonly IContext _context;

public UserManagerProvider(IContext context)
{
_context = context;
}

public IUserManager Create(User currentUser)
{
if (currentUser.Role == "User A")
return _context.Kernel.Get<UserManagerA>();

if (currentUser.Role == "User B")
return _context.Kernel.Get<UserManagerB>();

// Or bind and resolve by name
// _context.Kernel.Get<IUserManager>(currentUser.Role);
}
}

在 Controller 中:

private readonly IUserManager _userManager;

public UserController(IUserManagerProvider userManagerProvider)
{
_userManager = userManagerProvider.Create(CurrentUser);
}

此外,作为旁注,您可能应该有一个 CurrentUserProvider 负责获取当前用户。依赖静态方法会使单元测试变得困难,并且您实质上是在所有引用它的类中隐藏了依赖项:

private readonly IUserManager _userManager;
private readonly User _currentUser;

public UserController(IUserManagerProvider userManagerProvider, ICurrentUserProvider currentUserProvider)
{
_currentUser = currentUserProvider.GetUser();
_userManager = userManagerProvider.Create(_currentUser);
}

关于c# - 抽象工厂和控制反转在运行时解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29018010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com