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

2024-01-08

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

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


创建一个类负责提供正确的UserManager并将其注入到您的控制器中:

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);
    }
}

在控制器中:

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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象工厂和控制反转在运行时解析 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • IsReusable 属性中的上下文切换

    是否可重用属性 下面是我的理解IsReusable财产 如果处理程序返回静态内容 将值设置为 true 是安全的 但如果线程返回动态内容 为了使其线程安全 IsReusable应设置为 false 在这种情况下 可能会发生上下文切换 这可能
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • 使用属性文件代替静态最终变量

    我有许多带有静态最终字段的类 它们用作默认值或配置 创建全局配置文件的最佳方法是什么 我应该将这些字段移至单个静态类 使用属性文件还是什么 编辑 我需要在 java 类和 xhtml 页面中使用这个值 价值观不依赖于环境 我可以编译项目来设
  • Electron 和 window 之间的 IPC 通信不起作用

    我正在尝试编写我的第一个基于 Electron Boilerplate 的 Electron 应用程序 我正在尝试从主 Electron 进程发送一条简单的消息到我的窗口中 但似乎该消息没有发送 我所执行的主要代码如下 background
  • 在夏时制时将日期移动一小时

    我正在逐行处理文件 每行都有一个日期 格式如下 YYMMDD HHMM 该文件基本上每 15 分钟记录一次读数 录制时使用了所在时区的夏令时 我遇到的问题是在春季和秋季期间 记录是重复发生回退时的日期和发生回退时的间隙 后备示例 14110
  • 使用Jersey客户端进行POST操作

    在 Java 方法中 我想使用 Jersey 客户端对象对 RESTful Web 服务 也使用 Jersey 编写 执行 POST 操作 但不确定如何使用客户端发送将用作 FormParam 的值在服务器上 我可以很好地发送查询参数 我自
  • 模板和自定义功能;恐慌:函数未定义

    Using html template我正在尝试在模板中使用我自己的函数之一 不幸的是我无法使用 go 模板的函数映射功能 我得到的只是以下错误 go run test go panic template tmpl html 5 funct
  • 二叉搜索树的递归中序遍历

    我想在二叉搜索树 BST 中实现递归中序 我使用两个结构构建了一棵树 Node and Tree 我的代码到目前为止还没有工作 主要是因为类型不匹配Node inorder pub struct Node
  • 导出所有 Azure AD 组及其成员 (PowerShell)

    我见过很多关于导出群组和获取成员的帖子 但奇怪的是不是两者都涉及 基本上 我需要每个 AD 组及其相应成员的 csv 文件或类似文件 我认为这需要从 Azure 完成 因为我们有多个域和 Office 365 incloud 组 Azure
  • 使用 Python 从 PDF 中提取文本及其字体详细信息(样式、大小、颜色、斜体等)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望使用 Python 从 PDF 中提取文本及其字体详细信息 样式 大小 颜色 斜体等 我需要提取文本及其元数据以用于翻译目的 任何人
  • async/await 和 ES6 生成器的收益之间的区别

    我刚刚读了这篇精彩的文章 发电机 https www promisejs org generators 它清楚地突出显示了这个函数 它是一个用于处理生成器函数的辅助函数 function async makeGenerator return
  • Cordova 2.8.1:ios 上带有 photolibarary 源的camera.getPicture

    使用 cordova 2 8 1 我试图用 photolibrary 做一个camera getPicture 它似乎适用于 Android 但不适用于 iOS 下面是我如何调用 getPicture 代码 在装有 iOS 6 的 iPho
  • 基于 REST 的简单程序中的 HTTP 500 内部服务器错误。从服务器接收/发送响应时对 GET 和 POST 感到困惑

    我第一次使用 REST 服务实现基本的客户端服务器架构 这次 我通过包含更多的类和服务 并在客户端和服务器之间共享类对象作为参数 使事情变得更加复杂 我正在 ApacheTomcat7 上运行服务器 它正在成功执行 当我运行我的客户端时 它
  • 如何在启动时检测iPad的界面旋转?

    我在让我的 iPad 应用程序在我初始化的第一个 UIViewController 中检测其 interfaceOrientation 时遇到问题 在代码中 事实上 如果我跟踪 application statusBarOrientatio
  • 使用“gcloud build”时 Dockerfile COPY 命令缺少单个文件

    我遇到了一个令人难以置信的令人沮丧的问题 Dockerfile 中的 COPY 命令成功复制了除一个之外的所有应用程序文件 我没有 dockerignore 文件 所以我知道该文件不会以这种方式从构建中排除 注意 我确实有一个 gitign
  • 使用channelId获取YouTube频道个人资料图片

    因此 我尝试使用channelId 获取YouTube 频道的频道个人资料图片 我想简单地通过将channelId 添加到URL 并以这种方式获取图像来完成此操作 Facebook 有类似的东西 你可以使用这个 URL http graph
  • 使用 Symfony3.3 将存储库注入服务时出错

    我有一个由服务层和存储库层组成的应用程序 对于服务和存储库 我都声明了接口 并在控制器中注入服务的接口 并且服务被注入存储库的接口 这一切都是通过将 autowire 设置为 true 来完成的 当我在注入的服务之一上调用方法时 只要我不调
  • 使用 get_meta_tags() 函数检索同名元

    我正在尝试检索带有 php 的网页获取元标签 https www php net manual fr function get meta tags php功能 担心的是我的网页包含两个相同的元 And get meta tags 似乎只想检
  • 如何正确、安全地释放 C 中使用嵌套结构的所有内存?

    我嵌套了四层不同的结构 代码如下 typedef struct System system typedef struct College college typedef struct Student student typedef stru
  • Java JDK 8 IndexedPropertyDescriptor 自 JDK 7 以来已更改为 List 对象

    我有一个简单的问题 我有一个在 Java JDK7 中运行的程序 但由于一些内省更改而无法在 JDK8 中运行 这是重现该问题的测试程序 import java beans BeanInfo import java beans Intros
  • 使用异常时 SFINAE 仍然产生错误

    我正在学习 C 中的 SFINAE 因此 在阅读完相关内容后 我正在尝试不同的示例以更好地理解这个概念 下面我给出了 2 个片段 其中 1 个我能理解 但第二个片段是我使用过的noexcept在声明中我无法理解 实施例1 这个我能理解 in
  • 抽象工厂和控制反转在运行时解析

    我有以下类和接口结构 并且我很难尝试让代码执行我需要的操作 public interface IUserManager int Add User user public class UserManagerA IUserManager pub