Ninject 支持 Func(自动生成工厂)吗?

2023-11-22

Autofac 自动生成工厂Func<T>;我什至可以传递参数。

public class MyClass
{
    public MyClass(Func<A> a, Func<int, B> b)
    {
        var _a = a();
        var _b = b(1);
    }
}

我可以用 Ninject 做同样的事情吗?如果没有,我可以应用什么解决方法?

Thanks.

Update:

刚刚发现这个帖子,看来答案是否定的:

如何使用 Ninject 处理具有静态方法的类?


NB Ninject 3.0 及更高版本完全支持此功能Ninject.Extensions.Factory包,请参阅 wiki:-https://github.com/ninject/ninject.extensions.factory/wiki


编辑:注意有一个Bind<T>().ToFactory()Ninject 2.3 中的实现(这不是一个完全测试支持的版本,但可从 CodeBetter 服务器获取)

Ninject 目前不支持此功能。我们计划将其添加到下一个版本中。但是可以通过配置适当的绑定轻松添加支持。只需加载下面的模块即可享受。

public class FuncModule : NinjectModule
{
    public override void Load()
    {
        this.Kernel.Bind(typeof(Func<>)).ToMethod(CreateFunc).When(VerifyFactoryFunction);
    }

    private static bool VerifyFactoryFunction(IRequest request)
    {
        var genericArguments = request.Service.GetGenericArguments();
        if (genericArguments.Count() != 1)
        {
            return false;
        }

        var instanceType = genericArguments.Single();
        return request.ParentContext.Kernel.CanResolve(new Request(genericArguments[0], null, new IParameter[0], null, false, true)) ||
               TypeIsSelfBindable(instanceType);
    }

    private static object CreateFunc(IContext ctx)
    {
        var functionFactoryType = typeof(FunctionFactory<>).MakeGenericType(ctx.GenericArguments);
        var ctor = functionFactoryType.GetConstructors().Single();
        var functionFactory = ctor.Invoke(new object[] { ctx.Kernel });
        return functionFactoryType.GetMethod("Create").Invoke(functionFactory, new object[0]);
    }

    private static bool TypeIsSelfBindable(Type service)
    {
        return !service.IsInterface
               && !service.IsAbstract
               && !service.IsValueType
               && service != typeof(string)
               && !service.ContainsGenericParameters;
    }

    public class FunctionFactory<T>
    {
        private readonly IKernel kernel;

        public FunctionFactory(IKernel kernel)
        {
            this.kernel = kernel;
        }

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

Ninject 支持 Func(自动生成工厂)吗? 的相关文章

随机推荐

  • Java 使用实例方法而不是类/静态方法为每个实例化对象创建唯一 ID

    对此相当陌生 所以我希望标题中的术语正确 我想弄清楚如何创建一个实例方法这将执行以下操作 返回一个ID号 由于每个对象都是从类构造函数创建的 实例化 因此会为其分配一个唯一的整数 ID 号 第一个 ID 号是 1 当实例化新对象时 将分配连
  • MediaPlayer setDataSource 需要最佳实践建议

    看完之后 媒体播放 and 媒体播放器 android 文档我仍然很困惑 需要有经验的建议设置数据源重载方法 我在用MediaPlayer in a Service我的项目中的组件将是前台服务播放音乐时 我的音乐文件 mp3 位于res r
  • Eureka 服务给出请求执行错误?

    请求执行错误 端点 DefaultEndpoint serviceUrl http localhost 8761 eureka 当我在 docker windows 中运行时 它会给出 但是当我在 STS 中的 spring boot 应用
  • 如何识别脚本中是否使用了bash或dash?

    我正在编写一个 bash 脚本 在 Ubuntu 中使用 sh 命令时它会抛出错误 它似乎与 dash 不兼容 我正在学习这个主题 所以我想检测是否使用 dash 而不是 bash 来抛出错误 如何在脚本上下文中检测它 有可能吗 You c
  • 从 Eclipse 导入到 Android Studio 后无法运行任务 ':app:dexDebug" 执行失败

    有一个在 Eclipse 4 4 2 ADT 中运行的 Android 项目 在 Linux Ubuntu 14 10 上运行 我已经导入到 Android Studio 1 1 0 并设法摆脱了最初的编译错误 我想要做的下一件事是在我的手
  • Pandoc:带有 YAML 元数据的模板

    我使用 pandoc 生成带有 YAML 元数据的 index html 我知道从 pandoc 模板迭代关联数组 YAML Author Mastropiero Author Gunter Fraggen TEMPLATE for aut
  • 使用组件进行 Angular 2 表单级别验证

    在 Angular 2 中 如何在自定义组件中添加输入控件 并将其绑定到父组件中的表单控件容器 为简洁起见 简化了以下代码 例如 我有一个表单组件 请注意按钮禁用绑定 Component selector my form template
  • 如何在python中将数据模拟为request.Response类型

    我想写一些测试用例来练习对象检查在 isinstance obj requests Response 逻辑中 在我创建模拟数据作为 requests post 的返回值之后 模拟数据的类型始终是模拟类 这样 我如何重写模拟数据 使模拟数据可
  • 德米特混乱法则

    我希望有人能帮我解释一下德墨忒耳定律 如果我有一个类 我假设它是一个聚合根 并且其中有一个子类的集合 通过聚合根访问这些子类来更新它们的属性是否非法 e g public class Company company has a number
  • 将 text/xml 读入 ASP.MVC 控制器

    如何将文本 xml 读入 ASP MVC 控制器上的操作 我有一个 Web 应用程序 它可能会从两个不同的源接收 POSTed Xml 因此 Xml 的内容可能会有所不同 我希望控制器上的默认操作能够读取 Xml 但是我很难了解如何首先将
  • VC++ 2010 中“仅可移动类型”的问题

    我最近安装了 Visual Studio 2010 Professional RC 来尝试一下并测试 VC 2010 中实现的一些 C 0x 功能 我实例化了一个std vector of std unique ptr 没有任何问题 但是
  • javascript:函数调用自身

    我想下面的代码 jQuery mybutton click function do something 我怎么能回忆起这个 匿名 函数 我无法为此函数命名 var xfun function do something jQuery mybu
  • Delphi SOAP 数组问题

    我有一个用 delphi 创建的 SOAP 应用程序 输入到达服务器正确 但输出始终为空 r创建了对象 响应 但是length r notes 始终为 0 如果我在没有数组的情况下执行应用程序 它也可以正常工作 哪里有问题 三天的谷歌搜索和
  • 使用Jquery从Json对象获取父节点

    我试图通过子节点获取 json 对象中的父节点 我从客户端获得的 json 是一个多级目录层次结构 层次结构就像 Root Folder 1 folder1 a folder1 b folder 2 folder 3 folder3 a 我
  • PHP-通过 URL 获取文件类型

    我想使用 PHP 通过 URL 获取文件类型 例如 image gif 我尝试过 上面的代码给了我一个空白页 下面的代码返回 3 我哪里错了 已解决 使用 Fileinfo 获取内容类型
  • SQL Server - Guid VS。长的

    到目前为止 我一直在使用 C Guid Guid NewGuid 方法生成一个唯一的 ID 该 ID 可以使用 Linq to SQL 作为 ID 字段存储在我的一些 SQL Server 数据库表中 我被告知 出于索引原因 使用 GUID
  • 在SQLite UPDATE中模拟ORDER BY来处理唯一性约束

    我在 SQLite 3 中有一个表 sqlite gt schema CREATE TABLE table1 id INTEGER PRIMARY KEY NOT NULL title TEXT UNIQUE NOT NULL priori
  • 解决ReferenceError:Next.js中未定义localStorage [重复]

    这个问题在这里已经有答案了 我构建了一个 React 现在我尝试从 React Router dom 迁移到 Next js 我进行了重大更改并重构了代码 pages routes 和 store js 但后来我收到此错误 Referenc
  • 为什么在数据库设计中使用一对一关系?

    我很难弄清楚何时在数据库设计中使用一对一关系或者是否有必要 如果您只能选择查询中所需的列 是否有必要将表分解为一对一的关系 我想更新一个大表比更新一个小表对性能有更大的影响 我确信这取决于表用于某些操作 读 写 的程度 那么 在设计数据库模
  • Ninject 支持 Func(自动生成工厂)吗?

    Autofac 自动生成工厂Func