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