【问题标题】:Declaring Facade Class in Dependency Injection在依赖注入中声明外观类
【发布时间】: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


【解决方案1】:

关于是否使用IoC,我认为在框架库中使用IoC就可以了。这只是意味着您的框架有自己的容器和组合根,它们对任何消费者都是完全隐藏的。您可以创建易于使用的外观类。像这样的:

public class OrderServiceFacade
{
    private readonly IOrderService OrderService;

    public class OrderServiceFacade()
    {
        this.OrderService = ContainerWrapper.Container.Resolve<IOrderService>();
    }

    public void SubmitOrder(Order ord) {
        OrderService.SubmitOrder(ord);
    }
}

ContainerWrapper 是您的 Composition Root,它是 DI 容器的包装器。

internal class ContainerWrapper
{
    private Container _Container;
    public Container Container
    {
        if(_Container == null)
        {
            //initialize it
        }
        return _Container;
    }
}

当然,您需要 OrderService 和 TypeAOrderService 从新的 IOrderService 接口继承。这也将您的 TypeAOrderService 与您的 OrderService 分离,因为它可以在其构造函数中获取接口,而不是直接实例化特定的实现。如果您确实需要 TypeAOrderService 来调用 OrderService 上的方法,您可以使用装饰器模式并让 TypeAOrderService 将 IOrderService 作为附加依赖项。

【讨论】:

  • 感谢您指点framework has its own Container and Composition Root
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多