Asp.net mvc 4 使Ninject解析为方法绑定
我已经创建了一个MainFactory,它将解析我的类的所有依赖项,但是我想使用Ninject使它自动解析构造函数参数 所以,我尝试将接口绑定到工厂的方法,如下所示Asp.net mvc 4 使Ninject解析为方法绑定,asp.net-mvc-4,dependency-injection,ninject,Asp.net Mvc 4,Dependency Injection,Ninject,我已经创建了一个MainFactory,它将解析我的类的所有依赖项,但是我想使用Ninject使它自动解析构造函数参数 所以,我尝试将接口绑定到工厂的方法,如下所示 kernel.Bind<ILoggerContainer>().ToMethod(m => MainFactory.CreateLoggerContainer()); kernel.Bind().ToMethod(m=>MainFactory.CreateLoggerContainer()); 但是,当绑定依赖
kernel.Bind<ILoggerContainer>().ToMethod(m => MainFactory.CreateLoggerContainer());
kernel.Bind().ToMethod(m=>MainFactory.CreateLoggerContainer());
但是,当绑定依赖于ILogger容器的内容时,我需要指定解析其他容器的方法,如下所示
kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>()));
kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer());
kernel.Bind().ToMethod(m=>MainFactory.CreateUsersServiceContainer(kernel.Get());
现在我确信有更好的方法,特别是因为Ninject的主要目标是自动解决这些依赖关系
编辑:
MainFactory位于一个单独的项目中,该项目将包含所有依赖项,因此,如果依赖项发生更改,我只需要更新其DLL
使用ninject可以将构造函数设置为将接口的实现作为参数,并自动设置
主要的问题是我怎样才能做到这一点
kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>()));
kernel.Bind().ToMethod(m=>MainFactory.CreateUsersServiceContainer(kernel.Get());
像这样的事情
kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>()));
kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer());
kernel.Bind().ToMethod(m=>MainFactory.CreateUsersServiceContainer());
注意CreateUsersServiceContainer的参数已被删除,我假设Ninject可以用正确的值填充其参数(已绑定在Ninject中)我不太确定您的问题是什么,但看起来您试图做的是使用您的
MainFactory
类来构建所有其他类,但也可以使用Ninject构建“第二级”依赖项
对我来说,这似乎是一种非常奇怪的方法。您需要使用MainFactory
来构建顶级对象有什么特别的原因吗?这将表明一个设计问题,其中一个“上帝对象”被用来做许多事情。每次类需要一个新的依赖项时,您还必须更改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>());
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");
公共类主工厂
{
公共静态IFoo CreateFoo(ILogger日志)
{
返回新的Foo(log);
}
}
IFoo foo=MainFactory.CreateFoo(kernel.Get());
您可以将其替换为:
kernel.Bind<ILogger>().To<FileLogger>();
kernel.Bind<IFoo>().To<Foo>();
IFoo foo = kernel.Get<IFoo>();
kernel.Bind().To();
kernel.Bind().To();
IFoo foo=kernel.Get();
这是一个非常标准的Ninject方法。如果需要在运行时提供值,请查看以执行以下操作:
public class MainFactory
{
public static IFoo CreateFoo(ILogger log)
{
return new Foo(log);
}
}
IFoo foo = MainFactory.CreateFoo(kernel.Get<ILogger>());
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");
公共类Foo
{
公共Foo(字符串runtimeArg){…}
}
公共接口工厂
{
ifoocreatefoo(字符串runtimeArg);
}
kernel.Bind().To();
kernel.Bind().ToFactory();
IFooFactory factory=kernel.Get();
IFoo foo=factory.CreateFoo(“我的运行时值”);
当我创建一个新的依赖项时,我没有考虑需要更改什么,我想你用合适的绑定替换MainFactory是正确的,我只是想保留设计,以便在将来需要时添加AOP装饰器。