我已经开始学习WCF了,我已经完全糊涂了。我读了一些关于工厂模式的文章,我不知道ChannelFactory<>是如何或为什么实现它的。
也就是说,工厂模式的整个思想是工厂从客户端抽象出产品的创建和初始化,因此,如果引入了新的产品类型,客户端代码就不需要更改,因此可以立即开始使用新产品。
ChannelFactory<IRequestChannel> factory = new
ChannelFactory<IRequestChannel>(binding, address);
IRequestChannel channel = factory.CreateChannel();下面的代码不是有效的代码,但它只是用来说明,据我所知,ChannelFactory并不能通过直接实例化特定的通道类而带来任何好处:
IRequestChannel channel=new RequestChannelClass(binding, address);( a)第一个示例(实现工厂模式)的唯一好处是,在factory.CreateChannel返回的对象类型在将来某个时候发生更改时,客户端代码不需要更改。
但是如果这就是实现工厂模式的原因,那么任何返回对象的方法都应该实现一个工厂模式,以防将来返回对象的类型发生变化?!
c)因此,如果ChannelFactory<>.CreateChannel真正实现了工厂模式,那么客户端代码就可以通知factory.GetFactory (例如通过参数) factory.CreateFactory返回的对象/产品应该是什么类型?!
类似地,据我所知,ChannelFactory类也没有实现工厂模式?
谢谢
回复贾斯汀·尼斯纳:
b)工厂模式不一定要求您能够指定要创建的具体类型。它还允许工厂根据传递给它的参数(在本例中是绑定和地址)来确定具体类型。
那么,ChannelFactory.CreateChannel根据绑定和地址值选择返回的具体类型?我认为它总是返回相同的具体类型,而不管地址和绑定值如何?!
正如我已经问过另外两张海报一样,您是否同意,如果ChannelFactory.CreateChannel总是返回相同具体类型的实例,而不管绑定和地址值如何,那么ChannelFactory就不会实现工厂模式了吗?
回复Kevin Nelson
A)有两个好处。1)如果您开始使用IRequestChannel的新实现,那么实现代码就不必改变。
没错,但正如我在其他海报中提到的,如果这是类被限定为实现工厂模式的类的唯一要求,那么创建和返回具体实例的方法(以接口类型作为返回类型)的任何类都会实现工厂模式?据我所知,工厂模式是工厂根据客户端代码以某种方式提供的值生产不同的产品?!
另一方面,如果我正确理解Steve,那么基于绑定和地址值(传递给ChannelFactory的构造函数),对ChannelFactory.CreateChannel的调用将根据绑定和地址值(提供给构造函数)选择返回的具体类型。如果是这样的话,那么我就能理解为什么我们说ChannelFactory实现了工厂模式?!
那么您是否同意,如果ChannelFactory.CreateChannel总是返回相同具体类型的实例,而不管绑定值和地址值如何,那么ChannelFactory就不会实现工厂模式了吗?
回复Steve
IRequestChannel由抽象类RequestChannel实现。在.Net 4.0 HttpChannelFactory.HttpRequestChannel中,ReliableRequestSessionChannel和StreamedFramingRequestChannel都继承了RequestChannel。所以:
你说唯一的好处,但实际上我认为这是一个很大的好处。请记住,这也使WCF更具有可扩展性和灵活性。
但是,我们可以断言,任何创建和返回具体实例的方法(以接口类型作为返回类型)的类都实现了工厂模式?
c)客户端代码确实告诉工厂通过传递的绑定和地址间接返回哪个。
我认为ChannelFactory.CreateChannel总是返回相同具体类型的实例,不管传递给ChannelFactory.But构造函数的绑定和地址如何--您是说基于绑定和地址值(传递给ChannelFactory的构造函数),对ChannelFactory.CreateChannel的调用将返回以下类型之一:HttpChannelFactory.HttpRequestChannel ,ReliableRequestSessionChannel and StreamedFramingRequestChannel
如果是这样的话,那么我就能理解为什么我们说ChannelFactory实现了工厂模式?!
那么您是否同意,如果ChannelFactory.CreateChannel总是返回相同具体类型的实例,而不管绑定值和地址值如何,那么ChannelFactory就不会实现工厂模式了吗?
对Steve 的第二次回复
因此,根据绑定值和地址值,ChannelFactory.CreateChannel返回HttpRequestChannel、ReliableRequestSessionChannel或StreamedFramingRequestChannel?或者也可以返回其他类型的?
b)如果客户端代码总是使用相同类型的通道实例(例如HttpRequestChannel ),那么如果我们不使用ChannelFactory.CreateChannel,而是直接实例化HttpRequestChannel实例,那么没有什么问题:
HttpRequestChannel channel = new HttpRequestChannel( ... ) ( c) BTW --知道为什么msdn不包含任何描述HttpRequestChannel、ReliableRequestSessionChannel和“`StreamedFramingRequestChannel”类的条目吗?
发布于 2010-10-25 20:21:29
IRequestChannel由抽象类RequestChannel实现。在.Net 4.0 HttpChannelFactory.HttpRequestChannel中,ReliableRequestSessionChannel和StreamedFramingRequestChannel都继承了RequestChannel。所以:
你说唯一的好处,但实际上我认为这是一个很大的好处。请记住,这也使WCF更具有可扩展性和灵活性。
( c)客户端代码确实告诉工厂通过传递的绑定和地址间接返回哪一个。例如,我不想通过我所有的代码来改变一个具体的类型,因为微软决定淘汰我正在使用的代码。
是的,考虑到一开始提到的结构,这是一个典型的工厂模式实现。
编辑:
工厂模式?
但是,我们可以断言,任何创建和返回具体实例的方法(以接口类型作为返回类型)的类都实现了工厂模式?
不一定要引用Design书:抽象工厂模式提供了一个接口,用于在不指定具体类的情况下创建相关或依赖对象的系列。
所以您是否同意,如果ChannelFactory.CreateChannel总是返回相同具体类型的实例,而不管绑定和地址值如何,那么ChannelFactory就不会实现工厂模式了吗?
是
Edit2:
)它可以返回其他类型,因为可以在WCF中创建自定义绑定。
HttpChannelFactory.HttpRequestChannel是一个受保护的类,ReliableRequestSessionChannel和StreamedFramingRequestChannel是内部类;这就是在msdn上找不到它们的原因,也是为什么不能直接实例化这些类的原因。我通过Reflector了解到它们,我提到它们的要点是,ChannelFactory不一定总是返回相同的具体类型。
发布于 2010-10-25 20:01:22
工厂模式用于返回一个更通用的类/接口的具体实现。
在这种情况下,ChannelFactory将返回IRequestChannel的具体实现。在您的代码中,任何地方都没有告诉工厂要返回哪个具体类,这就是使它成为Factory的原因。至于你们的观点:
( a)通常认为最好的编码做法是返回尽可能不具体的类型。如果您可以返回接口的实例,就可以这样做。这将在未来减少维护方面的麻烦。
不过,请记住,返回最不特定的类型与Factory模式无关。工厂模式特定于对象实例的创建。
工厂模式不一定要求您能够指定要创建的具体类型。它还允许工厂根据传递给它的参数(在本例中为binding和address)确定具体类型。
( c)是的,ChannelFactory确实实现了工厂模式。
发布于 2010-10-25 20:11:23
还有一些模式可能比我更有效率(并对它们进行解释),但如下所示:
( A)有2项福利。1)如果您开始使用IRequestChannel的新实现,那么实现代码就不必改变。2)这也使您能够创建Mock对象。在单元测试项目中,您告诉ChannelFactory实例化一个模拟IRequestChannel。这样,您就可以将单元测试集中在您正在测试的方法的细节上,而不必创建实例化所有事物的实际实例的大型测试,等等(如果您不熟悉,请查找测试驱动开发(TDD)、控制反转(IoC)和依赖项注入(基本上是IoC的子集)。
我想说的是,您通常希望在层间使用工厂模式,而不是在层内使用。例如,您的服务层将为存储库层类实现一个工厂。这样,如果您的ICustomerRepostory从NHibernateCustomerRepository更改为CouchDBCustomerRespository...your服务层,则不需要知道任何有关此更改的信息。
其他的海报回答了其他的问题,我think...so我将远离C&D。
回复编辑:
所以您是否同意,如果ChannelFactory.CreateChannel总是返回相同具体类型的实例,而不管绑定和地址值如何,那么ChannelFactory就不会实现工厂模式了吗?
对不起,就我所理解的it...but的语义而言,问题不在于它是否返回多个具体类,而在于它是否能够在需要时返回不同的具体类。如果它不能生成不同的具体类,那么如果它“能够”在需要时生成不同的具体类,那么它就不是一个factory...but,那么它就是一个工厂模式。除此之外,我还要声明ignorance...and,即使是这样,我也不是说我不会错。
https://stackoverflow.com/questions/4018303
复制相似问题