1

我已经创建了一个 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 中)

4

1 回答 1

0

我不太确定你的问题是什么,但看起来你正在尝试做的是使用你的MainFactory类来构建所有其他类,但也使用 Ninject 来构建“二级”依赖项。

对我来说,这似乎是一种非常奇怪的方法。MainFactory编写顶级对象是否有特定的原因?这将表明一个设计问题,其中一个“上帝对象”用于做很多事情。MainFactory每次类需要新的依赖项时,您还必须更改 Ninject 绑定和方法,这首先破坏了使用依赖项注入框架的意义。

您是否可以MainFactory用适当的 Ninject 绑定替换,如果它们在运行时需要某些东西,也许使用 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");
于 2013-04-22T18:33:15.673 回答