我正在开发一个 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,要么只是缺少处理这个问题的东西。不幸的是,所有文档和示例似乎都集中在非常简单的 1 参数构造函数上......