1

假设我想注入这个接口的实现:

interface IService { ... }

实现为:

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

在此类的一个实例中:

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

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

谢谢!

4

2 回答 2

2
  1. 在大多数情况下,你不应该使用Field Injection,它应该只在循环依赖的极少数情况下使用。

  2. 您应该只在应用程序启动时使用内核一次,然后再也不使用。

示例代码:

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();
    }
}
于 2013-07-23T07:56:16.600 回答
0

只需使用参数完成...

kernel.Inject(new Target(), new ConstructorArgument("s", "someString", true));
于 2013-07-23T07:06:51.093 回答