【问题标题】:How to use a Provider in Ninject如何在 Ninject 中使用 Provider
【发布时间】:2012-01-03 17:33:54
【问题描述】:

我有以下代码

public class Something {
    [Inject]
    public Configuration config {get;set;} //singleton
    [Inject]
    public Provider<WindowHandler> windowsProvider { get; set; } //NOT singleton

    public void Search(string text) {
        WindowHandler handler = windowsProvider.Create(xxxxxx);
        //use the new handler that was created
    }
}

但 Provider 似乎在我放置 xxxxxx 的地方使用了 IContext。不应该使用我从内核引导并创建Something.cs时的IContext。 Provider上的无参数Create方法在哪里??? (我来自 Guice 土地的观点,它会像上面那样编码)。

所以问题是我该如何正确地做到这一点?

谢谢, 院长

【问题讨论】:

    标签: c# ninject


    【解决方案1】:

    您似乎正在尝试将提供程序用作代码中的工厂。

    在 Ninject 术语中的提供者是一个工厂,它被赋予 Ninject 以创建特殊创建的对象。因此,它获得了解析上下文,该上下文可用于根据实例注入的位置创建不同的实例。

    public class FooProvider : Provider<IFoo>
    {
        public override IFoo CreateInstance(IContext ctx)
        {
            // add here your special IFoo creation code
            return new Foo();
        }
    }
    
    kernel.Bind<IFoo>().ToProvider<FooProvider>();
    

    你想要的是在你的编码器中创建一个 WindowHandler 实例的工厂。因此创建一个接口来创建这样的实例:

    public interface IWindowHandlerFactory
    {
        WindowHandler Create();
    }
    
    Bind<IWindowHandlerFactory>().ToFactory();
    

    或者,您可以在不添加配置的情况下注入 Func&lt;WindowHandler&gt;。但这在我看来意义不大。

    注意:所有这些都需要 Ninject.Extensions.Factory 作为 Nuget 的预发行版 3.0.0-rc2 提供。

    另请参阅:http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

    【讨论】:

    【解决方案2】:

    好吧,我的最终解决方案是使用以下代码在 ninject 2.0 中作弊...

            var windowFactory = kernel.Get<IEWindowFactory>();
            var tabFactory = kernel.Get<IETabFactory>();
            windowFactory.Kernel = kernel;
            tabFactory.Kernel = kernel;
    

    在绑定列表中我有

    Bind<IEWindowFactory>().ToSelf().InSingletonScope();
    Bind<IETabFactory>().ToSelf().InSingletonScope();
    

    然后我就启动我的应用程序

    var main = kernel.Get<MainForm>();
    main.Start();
    

    当然,工厂被注入到 MainForm 的层次结构中我需要它们的地方。

    所以我在启动时手动放置内核,然后当我引导我的应用程序时,这些工厂自然是带有 [Ninject] 注释的类中的字段,因此它们可以创建对象。在我们获得 3.0 之前不是最干净的,但它可以工作(而且我讨厌我必须为其编写代码的额外工厂类,但哦,好吧)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2020-03-13
      • 2016-06-22
      相关资源
      最近更新 更多