Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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
C# 我是在试图错误地使用Ninject,还是遗漏了一些明显的东西?_C#_Asp.net Mvc 3_Ninject 2 - Fatal编程技术网

C# 我是在试图错误地使用Ninject,还是遗漏了一些明显的东西?

C# 我是在试图错误地使用Ninject,还是遗漏了一些明显的东西?,c#,asp.net-mvc-3,ninject-2,C#,Asp.net Mvc 3,Ninject 2,我正在开发一个ASP.NET MVC web应用程序。我想建立一个很好的数据层来抽象一切。因此,就像一个好的数据层一样,控制器不会直接与数据库通信 现在,当然,在数据层中有很多东西需要与数据库进行对话。我希望所有这些对象都使用相同的数据上下文(这是使用Linq2SQL,但不认为这很重要。)因此,这听起来很像存储库或工作单元模式。有点像,除了我主要只是实现工作单元部分 现在,我的问题是如何将数据上下文获取到所有需要它的类?我原以为Ninject可以在我需要的地方注射。如果我正在构造的对象在其构造函

我正在开发一个ASP.NET MVC web应用程序。我想建立一个很好的数据层来抽象一切。因此,就像一个好的数据层一样,控制器不会直接与数据库通信

现在,当然,在数据层中有很多东西需要与数据库进行对话。我希望所有这些对象都使用相同的数据上下文(这是使用Linq2SQL,但不认为这很重要。)因此,这听起来很像存储库或工作单元模式。有点像,除了我主要只是实现工作单元部分

现在,我的问题是如何将数据上下文获取到所有需要它的类?我原以为Ninject可以在我需要的地方注射。如果我正在构造的对象在其构造函数中只有一个参数,它就会这样做

所以这似乎很有效:

public class InjectedFoo
{
     InjectedFoo(IInjectable ii) {/*stuff*/}
}
但是,这给了我编译器错误:

public class InjectedFoo
{
     InjectedFoo(Object stuff, IInjectable ii) {/*stuff*/}
}
是的,这很有道理。毕竟编译器不知道Ninject将创建第二个参数。但同时,只有一个参数,Ninject就能计算出来。。。这似乎是重点。那么,如何使用这两个参数呢

现在,让我们把赌注提高一点:

public static class FooFactory
{
    public static MakeFoo(int fooID, IInjectable ii)
    {
    }
}
所以现在我想让一个类使用现有的数据上下文,而不需要实际实例化。我需要向它传递我想要的对象的ID。当然,我也有同样的问题,第二个参数没有传入,所以编译器会抱怨,但我甚至不能使用属性注入,因为我不能拥有非静态属性。(我知道我可以使用静态属性,但我不知道它是否安全。)


所以我觉得我不是错误地使用了Ninject,就是缺少了处理这个问题的方法。不幸的是,所有的文档和示例似乎都集中在非常简单的单参数构造函数上

提示:您是否尝试将两个
IInjectable
s作为参数传递?或者
IInjectable
iOnotherInjectable
?如果是的话,这和你的例子有什么不同?我可能对Ninject很糟糕,需要更多的提示。在回答你的问题时,我意识到我实际上并没有在任何地方直接调用构造函数。。。它只是被注入到我没有调用的控制器构造函数中。你是如何创建实例的?什么的实例?控制器?我不是,MVC正在某处为我做这件事。。。如果你指的是IInjectable,那么它就在一个Ninject模块中,只使用Bind.To.inRequestScope。问题是为了能够解析某些内容,IoC容器必须具有“绑定”,即类型和它们的表示之间的映射。接口或抽象类的表示可以是具体类。类型(甚至是值类型)的表示形式可以是值。这意味着,如果希望容器解析
int
s或
object
s,则必须首先在容器中注册它们(NInject语言中的“内核”)。