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