IOC,类工厂,开放/关闭

时间:2013-05-06 03:12:45

标签: vb.net inversion-of-control

我对IOC,工厂和开放/封闭原则有疑问。

如果愿意,请考虑以下工厂

public function PODocument( _type as string) as IPODocument

      dim d as new PODocument
      if _type = "service" then 
         d.header = new ServicePOHeader()
         d.details = new ServicePOLineItems()
      else if _type = "merchandise" then 
         d.header = new MerchandisePOHeader()
         d.details = new MerchandisePOLineItems()
      end if 

    return d

end function 

这对我有用,我可以很好地拥有一个关于异构集合的网页显示信息。

我的挑战是,今天有人告诉我,某个客户有时会订购服务和商品。来吧,我们中间谁能看到即将到来的?

因此,我编写了一组新的提供程序来处理增加的复杂性,将工厂更改为包含新类型的案例,我退回并运行。

然而,我违反了开放/封闭原则,改变了已经投入生产的工厂。 有没有办法设置它,以便我不是经常改变工厂?

提前感谢。

1 个答案:

答案 0 :(得分:1)

是。对于您的案例,最简单的示例是为每个_type定义工厂类,并将它们命名为ServiceFactoryMerchandiseFactory等,或者在其上添加<PODocumentType("Service")>等。

然后找到所有工厂(例如,使用反射),将它们放在Dictionary(Of String, IPODocumentFactory)中,并根据键选择正确的工厂。

在更复杂的情况下,除了IPODocumentFactory之外,CanCreate()界面可能还包含Create()方法。然后,您可以根据其对当前情况的看法选择列表中的工厂。

请注意,发现和列表解析支持通常由DI框架(例如Unity或Autofac)提供。