注入类的构造函数参数

时间:2013-07-20 15:20:23

标签: ninject

假设我想要注入此接口的实现:

interface IService { ... }

实施为:

class MyService : IService
{
    public MyService(string s) { }
}

在这个类的实例中:

class Target
{
    [Inject]
    public IService { private get; set; }
}

我通过调用kernel.Inject(new Target())来执行注入,但是如果我想在调用s时根据某些上下文指定构造函数的参数Inject,该怎么办? 有没有办法在注入时实现这种依赖于上下文的服务初始化?

谢谢!

2 个答案:

答案 0 :(得分:2)

  1. 在大多数情况下,您不应该使用 Field Injection 仅在极少数情况下使用循环依赖。

  2. 您应该只在开始时使用内核 申请,再也不会。

  3. 示例代码:

    interface IService { ... }
    
    class Service : IService
    {
        public Service(string s) { ... }
    }
    
    interface ITarget { ... }
    
    class Target : ITarget
    {
        private IService _service;
    
        public Target(IServiceFactory serviceFactory, string s)
        {
            _service = serviceFactory.Create(s);
        }
    }
    
    interface ITargetFactory
    {
        ITarget Create(string s);
    }
    
    interface IServiceFactory
    {
        IService Create(string s);
    }
    
    class NinjectBindModule : NinjectModule 
    {
        public NinjectBindModule()
        {
            Bind<ITarget>().To<Target>();
            Bind<IService>().To<Service>();
            Bind<ITargetFactory>().ToFactory().InSingletonScope();
            Bind<IServiceFactory>().ToFactory().InSingletonScope();
        }
    }
    

    用法:

    public class Program
    {
        public static void Main(string[] args)
        {
            IKernel kernel = new StandardKernel(new NinjectBindModule());
            var targetFactory = kernel.Get<ITargetFactory>();
            var target = targetFactory.Create("myString");
            target.DoStuff();
        }
    }
    

答案 1 :(得分:0)

只需使用参数...

kernel.Inject(new Target(), new ConstructorArgument("s", "someString", true));