C# 注入链隔离
我正在处理一个拆分为多个程序集的应用程序。每个程序集都提供与外部世界的接口,实例是通过基于Ninject的工厂生成的 啊,好吧,让代码存在吧。这来自正在执行的程序集C# 注入链隔离,c#,.net,binding,dependency-injection,ninject,C#,.net,Binding,Dependency Injection,Ninject,我正在处理一个拆分为多个程序集的应用程序。每个程序集都提供与外部世界的接口,实例是通过基于Ninject的工厂生成的 啊,好吧,让代码存在吧。这来自正在执行的程序集 public class IsolationTestModule : NinjectModule { public override void Load() { ServiceFactory sf = new ServiceFactory(); Bind<IService>
public class IsolationTestModule : NinjectModule
{
public override void Load()
{
ServiceFactory sf = new ServiceFactory();
Bind<IService>().ToMethod(context=>sf.CreatService()).InSingletonScope();
}
}
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
IKernel kernel = new StandardKernel(new IsolationTestModule());
IService service = kernel.Get<IService>();
}
}
实际发生的情况:在ServiceFactory
完成构建ServiceImpl
实例之前,一切都很好。在下一步中,应用程序的内核
尝试通过IsolationTestModule
解析serviceinpl
依赖关系,当然,由于异常而失败(没有可用的绑定,typeIDependantService
不可自绑定)。在我看来,工厂的内核应该做到这一点。。。
事实上,我从来不知道Ninject如此渴望解决依赖关系,即使在它没有立即创建的情况下,这无疑为我打开了新的视野;-)
为了暂时解决这个问题,我将serviceinpl
更改为基于构造函数的注入,如下所示:
public class ServiceImpl : IService
{
public IDependantService DependantService { get; set; }
[Inject]
public ServiceImpl(IDependantService dependantService)
{
DependantService = dependantService;
}
public void Idle()
{
DependantService.IdleGracefully();
}
}
尽管如此,我还是希望有一个不会强迫我改变注射策略的解决方案。有人知道如何分离注射链吗?你的观察是正确的。Ninject将为
ToMethod
创建的对象执行属性注入。另外,使用构造函数注入的解决方案也是正确的方法。构造函数注入是使用Ninject的最佳方式。属性注入应仅用于可选依赖项
你应该考虑只使用一个内核。在一个应用程序中使用多个内核实例是非常罕见的。您的观察是正确的。Ninject将为
ToMethod
创建的对象执行属性注入。另外,使用构造函数注入的解决方案也是正确的方法。构造函数注入是使用Ninject的最佳方式。属性注入应仅用于可选依赖项
你应该考虑只使用一个内核。在一个应用程序中使用多个内核实例是非常罕见的。谢谢您的回复,Remo。事实上,我正在创建三个完全独立的程序集。你可能会说,巧合的是,那些人有使用Ninject的习惯,并且可能会同时使用。每个都在内部使用Ninject,但只对外公开工厂类和接口。我已经切换到构造函数注入,所以,这基本上解决了。谢谢你的回复,Remo。事实上,我正在创建三个完全独立的程序集。你可能会说,巧合的是,那些人有使用Ninject的习惯,并且可能会同时使用。每个都在内部使用Ninject,但只对外公开工厂类和接口。我已经切换到构造函数注入,所以基本上解决了这个问题。
public class ServiceImpl : IService
{
public IDependantService DependantService { get; set; }
[Inject]
public ServiceImpl(IDependantService dependantService)
{
DependantService = dependantService;
}
public void Idle()
{
DependantService.IdleGracefully();
}
}