如何解决Ninject模块中的依赖关系?

Ami*_*abh 15 c# ninject asp.net-mvc-3

我正在使用Ninject 2和Asp.Net MVC 3.我有以下模块.

public class ServiceModule : NinjectModule
{
    public override void Load()
    {
        //I need to get the 'configHelper' from Ninject Container. 
        IConfigHelper configHelper = ResolveConfigHelperHere();

        Bind<IMyService>().To<MyServiceImpl>().WithConstructorArgument("myArg", configHelper.MyProperty);

    }
}
Run Code Online (Sandbox Code Playgroud)

我们如何获得已经在Ninject模块中绑定的'IConfigHelper'实例?

Dar*_*rov 17

var helper = Kernel.Get<IConfigHelper>();
Bind<IMyService>().To<MyServiceImpl>().WithConstructorArgument(
    "myArg",
    helper.MyProperty
);
Run Code Online (Sandbox Code Playgroud)

这是一个完整的例子:

public interface IConfigHelper
{
    string MyProperty { get; set; }
}

public class ConfigHelper : IConfigHelper
{
    public string MyProperty { get; set; }
}

public interface IMyService
{

}

public class MyServiceImpl : IMyService
{
    public MyServiceImpl(string myArg)
    {

    }
}

public class HelperModule : NinjectModule
{
    public override void Load()
    {
        Bind<IConfigHelper>()
            .To<ConfigHelper>()
            .WithPropertyValue("MyProperty", "foo");
    }
}

public class ServiceModule : NinjectModule
{
    public override void Load()
    {
        var helper = Kernel.Get<IConfigHelper>();
        Bind<IMyService>()
            .To<MyServiceImpl>()
            .WithConstructorArgument("myArg", helper.MyProperty);
    }
}

class Program
{
    static void Main()
    {
        IKernel kernel = new StandardKernel(
            new HelperModule(),
            new ServiceModule()
        );

        var service = kernel.Get<IMyService>();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Darin:你不认为这有点反模式吗?加载`ServiceModule`将失败,除非已经加载了'HelperModule`,但这不能在编译时强制执行,并且对于任何'StandardModule`的消费者都不会显而易见. (2认同)