C# - Ninject、IoC 和工厂模式

2023-12-15

我有一个控制台应用程序,我需要根据用户的输入执行某个功能。如果用户输入“功能 1”-> 我执行功能 1,依此类推。

我正在尝试尽可能干净和通用地编写这个项目,并且我想使用IoC and SOLID概念,我有点卡住了。

到目前为止我所拥有的:

public interface IFeature
{
    String execFeature();
}

and

interface IFeatureFactory
{
    IFeature createFeature(String input);
}

我的第一个想法就是拥有一个开关盒 on the 具体工厂类关于用户的输入,并创建具体的Feature相应地,但我敢打赌有更好的方法来做到这一点IoC.

我读到了 Ninject 工厂扩展,但不明白如何在我的项目中使用它。

使用 IoC/Ninject 实现工厂模式的最佳方法是什么?


如果您的 IFeature 实现没有其他依赖项,那么使用您的方法就很好而且非常简单。
例如,假设您有 2 个 IFeature 实现 - SomeFeature 和 OtherFeature,它们都具有无参数构造函数。
正如你所建议的,你的工厂实现将是这样的:

public class FeatureFactory: IFeatureFactory
{
    IFeature CreateFeature(string input)
    {
         if(input=="SomeFeature")
         {
           return new SomeFeature();
         }
         else
         {
           return new OtherFeature ();
         }
    }
}

然而,当您的 IFeature 实现使用这种方法有自己的依赖项时,您就失去了使用 Ninject 和 IoC 的意义。
例如,假设某个功能看起来像这样:

public class SomeFeature : IFeature
{
    private readonly IDependency1 _dependency1;
    private readonly IDependency2 _dependency2; 

    public SomeFeature (IDependency1 dependency1, IDependency2 dependency2)
    {
        _dependency1=dependency1;
        _dependency2=dependency2;
    }

    string execFeature()
    {
      //Some code here...
    }
}

其他功能类似...

 public class OtherFeature: IFeature
    {
        private readonly IDependency1 _dependency1;
        private readonly IDependency2 _dependency2; 

        public OtherFeature(IDependency1 dependency1, IDependency2 dependency2)
        {
            _dependency1=dependency1;
            _dependency2=dependency2;
        }

        string execFeature()
        {
          //Some code here...
        }
    }

现在你的工厂会变成这样:

 public class FeatureFactory: IFeatureFactory 
    {
        IFeature CreateFeature(string input)
        {
             if(input=="SomeFeature")
             {
               return new SomeFeature(new Dependency1Implementation(), new Dependency2Implementation());
             }
             else
             {
               return new OtherFeature(new Dependency1Implementation(), new Dependency2Implementation());
             }
        }
    }

这是您可以使用 ninject.extensions.factory 功能的地方 通过使用容器来为您解决此依赖关系。(此依赖关系可以有自己的依赖关系,并且很快就会变得混乱)。
正如其他人提到的,您可以使用命名绑定来绑定每个 IFeature 实现。

Bind<IFeature>().To<SomeFeature>().Named("SomeFeature");
Bind<IFeature>().To<OtherFeature>().Named("OtherFeature");

当然你也应该绑定其他依赖项

Bind<IDependency1>().To<Dependency1Implementation>();
Bind<IDependency2>().To<Dependency2Implementation>();

然后使用工厂扩展将 IFeatureFactory 绑定到 Factory。

Bind<IFeatureFactory>().ToFactory();

您要做的就是为 IFeatureFactory 中的每个 IFeature 实现创建工厂方法,并根据名为绑定的功能调用它 Get...。

public interface IFeatureFactory
{
  IFeature GetSomeFeature();
  IFeature GetOtherFeature();
}

现在 ninject 将为您实现(!)这个类,并知道为每个方法选择哪个实现。(不需要服务定位器......)
您可以在客户端的输入上使用 switch 语句来选择要调用的工厂方法,或者您可以将其包装在某个包含 switch 语句的提供程序类中,在这两种情况下,您都不必为IFeature 自己实现。
当然,如果需要以及其他更复杂的事情,您可以通过工厂方法将参数传递给实现构造函数。

我建议你阅读this了解更多信息。

Edit
我想强调的是,您不必为每个实现编写工厂方法,您可以对所有实现使用相同的方法(这是可能的,但更复杂)。
为此,您需要创建自定义实例提供程序来检测要实例化的实现(例如根据工厂参数),有关此内容的更多信息,请参见上面的链接和here.

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

C# - Ninject、IoC 和工厂模式 的相关文章

随机推荐

  • ASP GridView 在按钮单击时获取行值

    我正在做什么 单击图像按钮时重置用户密码 到目前为止已完成 添加了 GridViewCommandEventHandler 它正确触发 使用代码来自MSDN 我的 e CommandArgument 得到一个空字符串 并且在运行时抛出错误
  • 运行节点应用程序时 bcrypt 无效的 elf 标头

    我正在为学校开发一个 Nodejs 项目 我无法使用 npm 安装 bcrypt 所以我安装了 bcrypt nodejs 并且该项目昨天运行良好 但是今天 当我做 节点应用程序 时 我遇到了这个错误 node modules bcrypt
  • PHP $_REQUEST 作为数组

    我有一个搜索表单 我想将搜索词作为数组 REQUEST 这样我就可以列出每个搜索词 将每个搜索词包装在一个跨度中以进行样式设置 我怎么做 编辑 这是请求的代码
  • Swift 3.0 无法解析 DispatchQueue 的标识符

    我几个小时以来一直试图找到这个问题的答案 但仍然无济于事 我正在尝试使用以下代码 func fetchPosts ref child Amore child Posts observeSingleEventOfType Value with
  • 我正在尝试将 SFTP 文件(SAS 数据集或令牌)从一台服务器传输到 SAS 中的另一台服务器

    这是我第一次尝试使用 SAS 对文件进行 SFTP 我尝试使用文件名语句 但出现了一些错误 let user userid filename source sftp input sas7bdat user user pass passwor
  • 如何使用多部分实体将图像上传到服务器?

    我正在创建一个应用程序 并在我的应用程序中添加了一个选项来从图库浏览图像 然后上传到服务器 我之前问过这个问题 但没有得到好的答案 为了上传图像 我正在遵循本教程http mayanklangalia blogspot in 2014 04
  • 在 DLL 上使用 WPF 动态创建图像(而不是 GDI+)

    我需要动态生成图像 在阅读教程后here我意识到我可以使用 WPF 中的所有控件和布局来生成渲染 然后将其另存为 JPG 这个想法是使用它来代替 GDI 这是相当原始的 问题是 如何创建一个常规 dll 文件 该文件将以编程方式生成 WPF
  • 使用进程构建器执行两个命令

    我正在尝试编写一个程序 从命令提示符编译另一个 java 文件 不过我有一个问题 此时 它已成功执行编译 Mocha java 的第一部分 但是 我希望它也执行该文件并显示它的输出内容 它什么也没显示 有什么建议么 pb new Proce
  • 以编程方式将加载项宏添加到快速访问工具栏

    我有一个用于格式化 Excel 报告的宏 该宏需要在许多不同的工作簿上运行 因为每天都会生成报告并将其保存到新文件中 这已经在我的个人作业簿中了 我现在需要分享这个宏 我的计划是将该加载项放在我的本地加载项文件夹中 在那里进行任何更新并运行
  • 为Nextjs动态路由添加前缀

    我定义了很多路由 其中 一条路由专用于用户配置文件 每个用户都有一个可通过 HTTP example com username 访问的公共配置文件 我尝试过创建文件pages username js但它似乎不起作用 有没有办法在不通过用户名
  • 当主键具有不同名称时,如何使用 TPT 继承模型?

    针对旧数据库使用 Entity Framework 4 1 我无法生成一组非复数的 TPT 继承模型工作集 并且对公共主键使用不同的名称 我正在使用数据库表 组织 帐户 和 公司 如下所示 Organization Organization
  • 在 VBScript 中读取音乐文件长度

    我只是想知道是否有一种方法可以通过 VBScript 将 mp3 文件的长度以秒为单位获取到变量中 改编自我的答案关于 JScript 的类似问题 您可以使用GetDetailsOfWindows Shell 的方法Folder对象获取音频
  • 将 WordPress jQuery 添加到自定义页面模板

    我有一个插件 它有一个下面的自定义页面模板 该模板需要 jQuery 我有一个变量 link to js 喜欢 google 库 但我希望它将它链接到 WordPress 内部 jQuery 库
  • 如何在 html 片段的 X 段之后插入文本字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 如何用PHP解析和处理HTML content p This is the first paragraph p p This is the second paragraph p p This is t
  • WCF 服务的 SOAP 消息的服务器端跟踪

    我正在努力追随本教程为我的 WCF 服务配置服务器端 SOAP 跟踪 以及MSDN 文档 当我运行测试时 我在 Microsoft 服务跟踪查看器中看到活动 00000000 但消息选项卡为空 C temp Web tracelog svc
  • 排除CDH中spark-core的依赖

    我正在使用 Structured Spark Streaming 写入来自 Kafka 的 HBase 数据 我的集群发行版是 Hadoop 3 0 0 cdh6 2 0 我使用的是 Spark 2 4 0 我的代码如下 val df sp
  • 数据仓库模式:在DWH中直接链接事实表可以吗?

    在DWH中直接链接事实表可以吗 据我了解 在星系模式中事实表没有链接 它们只是有共同的维度表 但是 如果有一个 DWH 模式假设直接链接它们呢 IMO 他们不应该这样做 即使他们可以 事实表通常很大 可能有数十亿行 并以一定的粒度保存度量
  • 使用 ruby​​ 从 html 文档中删除空格

    所以我有一个红宝石字符串 类似于 str n n n n n n n n h1 My Page h1 n n div n p Here is a para graph It can contain spaces that should no
  • bootBuildImage 可以创建可写卷吗?

    给定一个将文件写入的 Spring Boot 应用程序 var lib app files 我使用 gradle 任务创建一个 docker 映像 gradlew bootBuildImage imageName app latest 然后
  • C# - Ninject、IoC 和工厂模式

    我有一个控制台应用程序 我需要根据用户的输入执行某个功能 如果用户输入 功能 1 gt 我执行功能 1 依此类推 我正在尝试尽可能干净和通用地编写这个项目 并且我想使用IoC and SOLID概念 我有点卡住了 到目前为止我所拥有的 pu