Я начал изучать WCF и уже в замешательстве. Я немного прочитал фабричный шаблон и не могу понять, как и почему ChannelFactory<>
его реализует.
А именно, вся идея фабричного шаблона заключается в том, что фабрика абстрагирует создание и инициализацию продукта от клиента и, таким образом, если вводится новый тип продукта, клиентский код не нужно менять и, таким образом, он может немедленно начать использовать новый продукт.
ChannelFactory<IRequestChannel> factory = new
ChannelFactory<IRequestChannel>(binding, address);
IRequestChannel channel = factory.CreateChannel();
Следующий код не является допустимым кодом, но он используется только для демонстрации того, что, насколько я могу судить, ChannelFactory
не дает никаких преимуществ по сравнению с непосредственным созданием конкретного класса канала:
IRequestChannel channel=new RequestChannelClass(binding, address);
a) Единственным преимуществом первого примера (реализации фабричного шаблона) является то, что клиентскому коду не нужно менять в случае, если тип объекта, возвращаемого factory.CreateChannel
, изменится когда-нибудь в будущем.
Но если это является причиной реализации фабричного шаблона, то любой метод, возвращающий объект, должен реализовать фабричный шаблон, на случай, если тип возвращаемого объекта когда-либо изменится в будущем ?!
в) Таким образом, если ChannelFactory<>.CreateChannel
действительно реализует фабричный шаблон, то клиентский код сможет сообщить factory.GetFactory (скажем, через параметр), какого типа должен быть объект / продукт, возвращаемый factory.CreateFactory
??
d) Точно так же, насколько я могу судить, класс ChannelFactory также не реализует шаблон фабрики?
спасибо
ОТВЕТЫ НА Джастина Нисснера:
б) Фабричный шаблон не
обязательно потребовать от вас возможности
указать конкретный тип
создано. Это также позволяет
завод по определению типа бетона
на основе переданных ему параметров
(в данном случае привязка и адрес).
То есть ChannelFactory.CreateChannel
выбрать конкретный тип для возврата на основе значений привязки и адреса? Я думал, что он всегда возвращает один и тот же конкретный тип, независимо от адреса и значения привязки?
Как я спросил у двух других авторов, согласитесь ли вы, что если ChannelFactory.CreateChannel
всегда будет возвращать экземпляр одного и того же конкретного типа, независимо от значений привязки и адреса, то ChannelFactory
не будет иметь фабричного шаблона реализованы?
ОТВЕТ НА Кевина Нельсона
A) Есть 2 преимущества. 1)
реализация кода не должна
изменить, если вы начнете использовать новый
реализация IRequestChannel.
Верно, но, как я уже говорил другим авторам, если это единственное требование, чтобы класс был квалифицирован как класс, реализующий шаблон фабрики, то любой класс с методом (с типом интерфейса в качестве возвращаемого типа), который создает и возвращает конкретный экземпляр, реализует шаблон фабрики? Насколько я могу судить, шаблон фабрики - это когда фабрика производит разные продукты на основе значений, которые каким-то образом предоставляются клиентским кодом?!
С другой стороны, если я правильно понял Стива Эллингера, то, основываясь на значениях привязки и адреса (передаваемых в конструктор ChannelFactory
), вызов ChannelFactory.CreateChannel
выберет конкретный тип для возврата на основе привязки и адреса значения (предоставляются конструктору). Если это так, то я могу понять, почему мы говорим ChannelFactory
реализует фабричный шаблон?!
Так вы бы согласились, что если бы ChannelFactory.CreateChannel
всегда возвращал экземпляр одного и того же конкретного типа, независимо от значений привязки и адреса, то ChannelFactory
не реализовал бы шаблон фабрики?
ОТВЕТИТЬ Стиву Эллингеру
IRequestChannel реализуется
абстрактный класс RequestChannel. В .Net
4.0 HttpChannelFactory.HttpRequestChannel,
ReliableRequestSessionChannel и
StreamedFramingRequestКанал все
наследовать от RequestChannel. Итак:
а) Вы говорите, единственное преимущество, но
на самом деле я думаю, что это значительное
выгода. Имейте в виду, это также делает
WCF расширяемый и многое другоеFlexible.
Но тогда мы могли бы утверждать, что любой класс с методом (с типом интерфейса в качестве возвращаемого типа), который создает и возвращает конкретный экземпляр, реализует фабричный шаблон?
c) Код клиента действительно сообщает фабрике, что возвращать, косвенно по переданной привязке и адресу.
Я думал, что ChannelFactory.CreateChannel
всегда будет возвращаться в случае одного и того же конкретного типа, независимо отпривязка и адрес, переданные конструктору ChannelFactory
. Но вы говорите, что на основе значений привязки и адреса (переданных конструктору ChannelFactory
), вызов ChannelFactory.CreateChannel
вернет один из следующих типов: HttpChannelFactory.HttpRequestChannel ,ReliableRequestSessionChannel and StreamedFramingRequestChannel
?
Если это так, то я могу понять, почему мы говорим ChannelFactory
реализует фабричный шаблон ?!
Так вы бы согласились, что если бы ChannelFactory.CreateChannel
всегда возвращал экземпляр одного и того же конкретного типа, независимо от значений привязки и адреса, тогда ChannelFactory
не реализовал бы фабричный шаблон?
ВТОРОЙ ОТВЕТ Стиву Эллингеру
a) Таким образом, в зависимости от значений привязки и адреса, ChannelFactory.CreateChannel
возвращает либо HttpRequestChannel
, ReliableRequestSessionChannel
или StreamedFramingRequestChannel
?Или он также может возвращать некоторые другие типы?
b) если клиентский код всегда будет использовать экземпляр канала одного и того же типа (скажем, HttpRequestChannel
), то в этом нет ничего плохого, если вместо использования ChannelFactory.CreateChannel
мы напрямую создаем экземпляр HttpRequestChannel
:
HttpRequestChannel channel = new HttpRequestChannel( ... )
в) Кстати, есть идеи, почему msdn не содержит записей, описывающих классы HttpRequestChannel
, ReliableRequestSessionChannel
и `StreamedFramingRequestChannel '?