首页 文章

Ninject工厂根据枚举创建T

提问于
浏览
1

我想让Ninject根据特定的枚举输入值解析T的实例 .

我已经阅读了有关Ninject工厂扩展的内容,但是我找不到工厂根据枚举解析特定类的任何示例 .

每个类派生自一个基类,派生类有几个不同的接口,Ninject也必须解决这些接口 .

例如,界面应如下所示:

public interface IProcessFactory
{
    T Create<T>(ProcessIndex processIndex) where T : BaseProcess;
}

怎么能实现这一目标?

2 回答

  • 0

    开箱即用不支持此功能 . 您可以通过编写自己的IInstanceProvider实现来自定义它(另请参见ninject Wiki entry . 然后为您的特定工厂配置它:

    kernel.Bind<IFooFactory>()
          .ToFactory(() => new MyCustomInstanceProvider());
    

    或者,如果要更改所有 .ToFactory() 绑定的行为:在加载 Ninject.Extensions.Factory 后重新绑定 IInstanceProvider

    kernel.Rebind<IInstanceProvider>().To<MyCustomInstanceProvider>();
    

    但是,如果它不是您经常需要的东西,我会考虑手动编写工厂实现@ composition root .

    无论如何,在这两种情况下,您都需要知道如何创建条件绑定 . Ninject称之为Contextual Binding . 一种方法是使用Binding-Metadata:

    const string EnumKey = "EnumKey";
    
    Bind<IFoo>().To<AFoo>()
                .WithMetadata(EnumKey, MyEnum.A);
    
    IResolutionRoot.Get<IFoo>(x => x.Get<MyEnum>(EnumKey) == MyEnum.A);
    

    另一种方法是创建自定义IParameter并在条件绑定中使用:

    Bind<IFoo>().To<AFoo>()
                .When(x => x.Parameters.OfType<MyParameter>().Single().Value == A);
    
  • 3

    有几个选项可用于使用DI(Ninject)实现AbstractFactory .

    在分析了选项之后,我想出了Mark Seemann提供的解决方案,请参阅http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/

    基于容器的工厂解决方案是我选择的解决方案,因为:

    • 性能:按需DI根据请求解析,没有在构造函数中加载实例

    • 易于重构:当我们想要将当前的DI框架(Ninject)替换为具有(几乎或甚至更好)功能集的更好的执行者时,唯一需要改变的地方是工厂内部的调用,而不是NinjectModules / Composition Root中的调用 .

    另见SO:Simple Injector:Factory classes that need to create classes with dependencies

相关问题