C# 注入链隔离

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>

我正在处理一个拆分为多个程序集的应用程序。每个程序集都提供与外部世界的接口,实例是通过基于Ninject的工厂生成的

啊,好吧,让代码存在吧。这来自正在执行的程序集

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
依赖关系,当然,由于异常而失败(没有可用的绑定,type
IDependantService
不可自绑定)。在我看来,工厂的内核应该做到这一点。。。 事实上,我从来不知道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();
    }
}