参考与依赖

时间:2012-02-10 10:02:32

标签: architecture dependency-injection inversion-of-control

this问题后,我现在有以下结构:

Wolfie.Core - 包含业务逻辑&实体,还包含存储库接口(例如IUserRepository)需要访问存储库的类正在使用构造函数注入。

Wolfie.Data - 引用Wolfie.Core并有一个实现IUserRepository的UserRepository

所以到目前为止我很满意。 Core对数据实现一无所知,因此不依赖于任何内容。

我遇到的绊脚石在我的网络层。

我的Web项目引用了我的Core项目。然后我可以创建一个Core类,比如User,但是我必须将IUserRepository的具体实现传递给它。所以我需要在我的Web项目中引用我的Data项目,这似乎是错误的。它现在看起来似乎Web依赖于数据,它不应该是。

那么,如何在没有直接引用数据的情况下将我的Core User类注入Data类?

期待您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以绑定到主应用程序代码中的接口,仅引用合同程序集(“Core”程序集)。然后使用反射在运行时加载依赖项并注入具体的类。

有一些问题需要解决:

  • 您将如何找到必要的装配体?
  • 找到装配后,您应该使用哪些具体类?
  • 您将如何松散地配置您的应用程序以使用这些程序集和那些具体的类?您不希望简单地将硬编码的程序集引用和具体的类引用转换为硬编码的程序集和类名字符串......

这些问题可以通过多种方式解决,是不同依赖注入库之间的主要区别因素之一。

有些使用顶级配置代码或配置代码模块(例如NInject),有些使用XML配置(例如Unity),有些使用基于属性/约定的自动发现机制(用于例如MAF / MEF),有些人使用所有这些的组合(例如Castle.Windsor)。

大多数或所有这些图书馆都支持每种机制,但我已经提到了最突出的重点。