Vb.net IOC,类工厂,打开/关闭

Vb.net IOC,类工厂,打开/关闭,vb.net,inversion-of-control,Vb.net,Inversion Of Control,我有一个关于国际奥委会、工厂和开放/封闭原则的问题 如果愿意,请考虑以下工厂 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()

我有一个关于国际奥委会、工厂和开放/封闭原则的问题

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

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 
这对我来说很有用,我可以很好地用一个网页来显示关于异构集合的信息

我的挑战是,今天有人告诉我,有时某个客户会一起订购服务和商品。拜托,我们当中谁能预见到这一点

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

但是,我改变了已投入生产的工厂,违反了开放/关闭原则。 有没有一种方法可以让我不经常更换工厂


提前谢谢。

是的。对于您的案例,最简单的示例是为每个
\u类型定义一个factory类,并将它们命名为
ServiceFactory
merchandisepactory
,等等,或者在它们上面加一个
等等

然后只需找到所有工厂(例如,使用反射),将它们放在
字典(字符串的,IPODocumentFactory)
中,并根据键选择正确的工厂

在更复杂的情况下,
IPODocumentFactory
接口可能包括
CanCreate()
方法以及
Create()
。然后,您可以根据工厂对当前情况的看法从列表中选择一家工厂


请注意,发现和列表解析支持通常是由Unity或Autofac等DI框架提供的现成支持。

您不必担心,这些原则并不意味着遵循教条,您的设计很好。谢谢Andy,这些都是有用的设计建议。我可能需要认真研究一下DI框架。我一直在像躲避瘟疫一样躲避它。在您提到的2个选项中,您有偏好吗?当我有选择时,我总是使用Autofac。不久前,我对IoC框架进行了一些比较,从功能上看,这似乎是最好的选择。如果您不介意部件直接引用Autofac,它还提供了一个开箱即用的模块系统。