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

16

我正在使用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);

    }
}

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

1个回答

18
var helper = Kernel.Get<IConfigHelper>();
Bind<IMyService>().To<MyServiceImpl>().WithConstructorArgument(
    "myArg",
    helper.MyProperty
);

下面是完整的示例:

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>();
    }
}

1
我不理解Kernel.Get<IConfigHelper>()方法,尽管我有Kernel.GetService方法。 - Amitabh
@Darin:谢谢。这只是使用Ninject的问题吗? - Amitabh
1
@Amitabh,是的.Get<T>是一种扩展方法,因此必须将正确的命名空间引入范围以便使用它。 - Darin Dimitrov
2
@Darin:你不认为这有点反模式吗?加载ServiceModule将失败,除非已经加载了HelperModule,但这无法在编译时强制执行,并且对于StandardModule的任何使用者也不会显而易见。 - fearofawhackplanet
@fearofawhackplanet:模块不发布自己的依赖关系确实感觉很奇怪。这种情况下有什么最佳实践吗? - Kevin Coulombe
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接