答案 0 :(得分:2)
IRequestChannel由抽象类RequestChannel实现。在.Net 4.0中,HttpChannelFactory.HttpRequestChannel,ReliableRequestSessionChannel和StreamedFramingRequestChannel都从RequestChannel继承。所以:
a)你说唯一的好处,但实际上我认为这是一个重大的好处。请记住,这也使WCF可扩展且更灵活。
c)客户端代码通过传递的绑定和地址间接告诉工厂返回哪个。我不想通过我的所有代码来改变具体类型,因为微软决定废弃我正在使用的代码。
d)是的,鉴于开头提到的结构,这是典型的工厂模式实现。
编辑:
工厂模式?
但是我们可以宣称任何课程 使用方法(具有接口类型 作为返回类型)创建和 返回一个具体的实例实现 工厂模式?
引用Design Patterns一书不一定:抽象工厂模式提供了一个接口,用于创建相关或依赖对象的族,而不指定它们的具体类。
如果是,你会同意吗? ChannelFactory.CreateChannel总是 返回了相同的实例 具体类型,无论如何 然后是绑定和地址值 ChannelFactory没有工厂 模式实施?
是
EDIT2:
a)它可以返回其他类型,因为可以在WCF中创建自定义绑定
b)& c)HttpChannelFactory.HttpRequestChannel是受保护的类,ReliableRequestSessionChannel和StreamedFramingRequestChannel是内部类;这就是为什么你无法在msdn上找到它们,以及为什么你不能直接实例化这些类。我通过Reflector发现了它们,我提到它们的意思是ChannelFactory不一定总是返回相同的具体类型
答案 1 :(得分:1)
Factory模式用于返回更通用的类/接口的具体实现。
在这种情况下,ChannelFactory将返回IRequestChannel的具体实现。在你的任何代码中都没有告诉工厂哪个具体的类返回哪个是什么使它成为工厂。至于你的观点:
a)通常认为良好的编码实践可以返回最不具体的类型。如果您可以返回返回接口的实例,请执行此操作。它将减少未来的维护难题。
请记住,返回最不具体的类型与Factory模式无关。 Factory模式特定于创建对象的实例。
b)工厂模式不一定要求您能够指定要创建的具体类型。它还允许工厂根据传递给它的参数确定具体类型(在这种情况下,binding
和address
)。
c)是的,ChannelFactory确实实现了工厂模式。
答案 2 :(得分:1)
还有其他一些可能比我更有效的模式(并解释它们),但这里有:
A)有两个好处。 1)如果您开始使用IRequestChannel的新实现,则不必更改实现代码。 2)这也使您可以制作Mock对象。在单元测试项目中,您告诉ChannelFactory实例化Mock IRequestChannel。这样,您可以将单元测试集中在您正在测试的方法的细节上,而不是必须创建一个庞大的测试来实例化所有实际的实例,等等。(如果您不熟悉,请查看测试驱动开发(TDD) ),控制反转(IoC)和依赖注入(基本上是IoC的一个子集)。
B)我想说你通常想要在层之间使用工厂模式,而不是在层内。例如。您的服务层将为您的存储库层类实现工厂。这样,如果您的ICustomerRepostory从NHibernateCustomerRepository更改为CouchDBCustomerRespository ......您的服务层不必知道有关此更改的任何信息。
其他海报回答了其他问题,我想......所以我会离开C& D单独。
回复编辑:
如果是,你会同意吗? ChannelFactory.CreateChannel总是 返回了相同的实例 具体类型,无论如何 然后是绑定和地址值 ChannelFactory没有工厂 模式实施?
很抱歉,可能在我的脑海中对它的语义有所了解......但据我的理解,重点不在于它是否确实返回了多个具体类,而在于它能否返回不同的具体类如果需要的话。如果它不能生产不同的混凝土类别,那么它就不会是工厂......但如果它“能够”在需要时“能够”产生不同的具体类别,那么它就是工厂模式。除此之外,我必须宣布无知......即便如此,我也不是说我不会错。