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,它还提供了一个开箱即用的模块系统。