假设我想要注入此接口的实现:
interface IService { ... }
实施为:
class MyService : IService
{
public MyService(string s) { }
}
在这个类的实例中:
class Target
{
[Inject]
public IService { private get; set; }
}
我通过调用kernel.Inject(new Target())
来执行注入,但是如果我想在调用s
时根据某些上下文指定构造函数的参数Inject
,该怎么办?
有没有办法在注入时实现这种依赖于上下文的服务初始化?
谢谢!
答案 0 :(得分:2)
在大多数情况下,您不应该使用 Field Injection 仅在极少数情况下使用循环依赖。
您应该只在开始时使用内核 申请,再也不会。
示例代码:
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));