【发布时间】:2013-05-10 21:52:04
【问题描述】:
我正在使用依赖注入。假设我有一个这样的 OrderService 类:
public class OrderService{
public OrderService(
IOrderValidator validator
, IOrderRepository repository
, IOrderNotificator notificator){
//assign global fields
}
public void SubmitOrder(Order ord){
if(validator.IsOrderValid(ord)){
repository.InsertNew(ord);
notificator.Notify(ord);
}
}
}
现在我想创建一个外观类,例如 TypeAOrderService,由 OrderService 继承,并在构造函数中声明组件,例如:
public class TypeAOrderService : OrderService{
public TypeAOrderService() : base(
new OrderValidator(),
new OrderRepository(),
new OrderNotificator()) { }
}
(请注意,注入组件复杂性的实现在这里并不重要,adapter pattern 也可以代替继承。
这里可能有缺点,因为我们没有在组合根处定义依赖关系。但是我想知道在某些情况下是否可以接受。尤其是在framework component,通过访问 DI Container 并自己解决它来使用框架是相当奇怪的。
更新:
正如评论中提到的,目前我不使用任何 IOC 容器。我的观点是,在框架中使用 IOC 容器很奇怪,因为这意味着每个使用框架的应用程序都需要使用 IOC 容器。如果我的观点是错误的,请随时纠正我。
我所指的框架示例是 System.Windows.Forms.Form,我不使用任何 IOC 容器并且不确定依赖关系。
【问题讨论】:
-
您好 Fendy,您是尝试仅使用依赖注入,还是还尝试使用 IOC 容器。恕我直言,您采用的方法将起作用,但是如果您使用的是 IOC 容器(如 Windsor),我认为您最好为您的组件创建一个安装程序。也许这篇文章可以帮助你kozmic.net/2010/08/10/…
-
@Marwijn 目前我不使用任何 IOC 容器。我的观点是,在 Framework 中使用 IOC 容器很奇怪,因为这意味着每个使用框架的应用程序都需要使用 IOC 容器(如果我的观点错误,请解释一下)。我指的是框架示例,例如
System.Windows.Forms.Form -
如果您不想使用 IOC 容器,并且您似乎有正当理由这样做,我认为您的方法很好。在这种情况下,OrderValidator、OrderRepository 和 OrderNotificator 甚至可能是您的 Assembly 的私有类。
-
@Marwijn 我更新了关于 IOC 容器的问题。看来你的说法很有道理。能否请您通过回答问题来解释一下?
-
让我明天试着回答一下,然后我可以用这些简短的 cmets 更好地表达它。
标签: design-patterns architecture dependency-injection