【问题标题】:How to resolve a dependency inside a Ninject Module?如何解决 Ninject 模块中的依赖关系?
【发布时间】:2011-03-23 17:56:55
【问题描述】:

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

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' 实例?

【问题讨论】:

    标签: c# asp.net-mvc-3 ninject


    【解决方案1】:
    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>();
        }
    }
    

    【讨论】:

    • 我没有得到 Kernel.Get() 方法。虽然我有 Kernel.GetService 方法。
    • @Amitabh,这很奇怪。 Get&lt;T&gt;IResolutionRoot 的扩展方法,由IKernel 实现,定义在Ninject 命名空间中。您使用的是哪个版本?对于我的测试,我获取了最新的 Ninject NuGet 包,它运行得非常好。
    • @Darin:我从 Nuget 获得了 Ninject.MVC3 - 2.2.0.3
    • @Amitabh,是的,.Get&lt;T&gt; 是一种扩展方法,因此必须将正确的命名空间纳入范围才能使用它。
    • @Darin:你不认为这有点反模式吗?除非 HelperModule 已经加载,否则加载 ServiceModule 将失败,但这不能在编译时强制执行,并且对于 StandardModule 的任何使用者都不会明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2022-01-11
    • 2010-10-16
    相关资源
    最近更新 更多