使Ninject解析ToMethod绑定

时间:2013-04-22 16:33:12

标签: asp.net-mvc-4 dependency-injection ninject

我已经创建了一个MainFactory来解析我的类的所有依赖项,但是我想使用Ninject来使它自动解析构造函数参数。

所以,我正在尝试将接口绑定到我工厂的方法,如此

kernel.Bind<ILoggerContainer>().ToMethod(m => MainFactory.CreateLoggerContainer());

但是,当我绑定依赖于ILoggerContainer的东西时,我需要指定解析其他容器的方法

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>()));

现在我确信有更好的方法,特别是因为Ninject的主要目标是自动解决这些依赖关系。

修改 MainFactory位于一个单独的项目中,它将包含所有依赖项,因此,如果依赖项发生更改,我只需要更新其DLL。

使用ninject,以便我可以将构造函数设置为将接口的实现作为参数,并自动设置,

主要问题是我该如何做到这一点

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>()));

这样的事情

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer());

请注意,CreateUsersServiceContainer的参数已被删除,我假设Ninject可以使用正确的值填充其参数(已绑定在Ninject中)

1 个答案:

答案 0 :(得分:0)

我不太确定您的问题是什么,但您尝试做的是使用您的MainFactory类来构建所有其他类,还使用Ninject来构建& #34;第二级&#34;的依赖关系。

对我而言,这似乎是一种非常奇怪的方法。是否有一个特殊原因需要MainFactory来编写顶级对象?这将表明一个设计问题,其中一个上帝对象&#34;用来做很多事情。每当一个类需要一个新的依赖时,你也必须改变你的Ninject绑定和你的MainFactory方法,这种方式首先打破了使用依赖注入框架的重点。

是否可以用适当的Ninject绑定替换MainFactory,如果在运行时需要某些东西,可能使用Ninject提供者/工厂来构建对象?例如,如果您的MainFactory有类似的内容:

public class MainFactory
{
    public static IFoo CreateFoo(ILogger log)
    {
        return new Foo(log);
    }
}

IFoo foo = MainFactory.CreateFoo(kernel.Get<ILogger>());

您可以将其替换为:

kernel.Bind<ILogger>().To<FileLogger>();
kernel.Bind<IFoo>().To<Foo>();
IFoo foo = kernel.Get<IFoo>();

这是一种非常标准的Ninject方法。如果您需要在运行时提供值,请查看Ninject Factory Extension以执行以下操作:

public class Foo
{
    public Foo(string runtimeArg) { ... }
}

public interface FooFactory
{
    IFoo CreateFoo(string runtimeArg);
}

kernel.Bind<IFoo>().To<Foo>();
kernel.Bind<IFooFactory>().ToFactory();
IFooFactory factory = kernel.Get<IFooFactory>();
IFoo foo = factory.CreateFoo("my runtime value");