Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 使Ninject解析为方法绑定_Asp.net Mvc 4_Dependency Injection_Ninject - Fatal编程技术网

Asp.net mvc 4 使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()); 但是,当绑定依赖

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

所以,我尝试将接口绑定到工厂的方法,如下所示

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装饰器。