Ninject Singleton Factory

时间:2013-03-16 18:33:58

标签: c# ninject

我有一个绑定到类的接口。一切都像排除一样工作。我想用构造函数注入创建类,而不是在任何地方传递我的内核。我想为这些提议建立一个单身工厂。如何在不使用ninject.extensions.factory库的情况下创建一个。

2 个答案:

答案 0 :(得分:2)

如果你想创建一个工厂但没有使用工厂扩展(不知道为什么,我认为这正是你需要的),你可以做如下的事情:

public class FooFactory : IFooFactory
{
    // allows us to Get things from the kernel, but not add new bindings etc.
    private readonly IResolutionRoot resolutionRoot;

    public FooFactory(IResolutionRoot resolutionRoot)
    {
        this.resolutionRoot = resolutionRoot;
    }

    public IFoo CreateFoo()
    {
        return this.resolutionRoot.Get<IFoo>();
    }

    // or if you want to specify a value at runtime...

    public IFoo CreateFoo(string myArg)
    {
        return this.resolutionRoot.Get<IFoo>(new ConstructorArgument("myArg", myArg));
    }
}

public class Foo : IFoo { ... }

public class NeedsFooAtRuntime
{
    public NeedsFooAtRuntime(IFooFactory factory)
    {
        this.foo = factory.CreateFoo("test");
    }
}

Bind<IFooFactory>().To<FooFactory>();
Bind<IFoo>().To<Foo>();

Factory Extension只是在运行时为您完成所有这些工作。您只需要定义工厂接口,扩展就会动态创建实现。

答案 1 :(得分:0)

试试这段代码:

class NinjectKernelSingleton
{
    private static YourKernel _kernel;

    public static YourKernel Kernel
    {
        get { return _kernel ?? (_kernel = new YourKernel()); }
    }

}

public class YourKernel
{
    private IKernel _kernel;
    public YourKernel()
    {
        _kernel = InitKernel();
    }

    private IKernel InitKernel()
    {
        //Ninject init logic goes here
    }

    public T Resolve<T>() 
    {
        return _kernel.Get<T>();
    }
}