ChannelFactory реализует фабричный шаблон? - PullRequest
0 голосов
/ 25 октября 2010

Я начал изучать 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 '?

Ответы [ 3 ]

2 голосов
/ 26 октября 2010

IRequestChannel реализуется абстрактным классом RequestChannel. В .Net 4.0 HttpChannelFactory.HttpRequestChannel, ReliableRequestSessionChannel и StreamedFramingRequestChannel все наследуются от RequestChannel. Итак:

а) Вы говорите, единственное преимущество, но на самом деле я думаю, что это значительное преимущество. Имейте в виду, это также делает WCF расширяемым и более гибким.

в) Код клиента сообщает фабрике, что возвращать, косвенно по переданной привязке и адресу. Я, например, не хотел бы проходить через весь мой код, чтобы изменить конкретный тип, потому что Microsoft решила устареть тот, который я использовал.

d) Да, учитывая структуру, упомянутую в начале, это типичная реализация шаблона Factory.

Edit:

заводская модель?

Но тогда мы могли бы утверждать, что любой класс с методом (с типом интерфейса как тип возвращаемого значения), который создает и возвращает конкретный экземпляр орудия заводской образец?

Не обязательно цитировать книгу «Шаблоны проектирования»: абстрактный шаблон фабрики предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

Так вы бы согласились, что если ChannelFactory.CreateChannel всегда вернул экземпляр того же конкретный тип, независимо от значения привязки и адреса, затем У ChannelFactory не будет фабрики шаблон реализован?

Да

Edit2:

a) Может возвращать другие типы, потому что в WCF можно создавать собственные привязки

b) & c) HttpChannelFactory.HttpRequestChannel является защищенным классом, ReliableRequestSessionChannel и StreamedFramingRequestChannel являются внутренними классами; Вот почему вы не можете найти их в MSDN, а также почему вы не можете создавать экземпляры этих классов напрямую. Я узнал о них через Reflector, и я хотел бы упомянуть их о том, что ChannelFactory не обязательно все время возвращает один и тот же конкретный тип

1 голос
/ 26 октября 2010

Есть другие, которые, вероятно, более эффективны с шаблонами (и объясняют их), чем я, но здесь идет речь:

А) Есть 2 преимущества. 1) реализация кода не должна измениться, если вы начнете использовать новую реализацию IRequestChannel. 2) Это также позволяет создавать макет объектов. В вашем модульном тестовом проекте вы указываете ChannelFactory создать экземпляр Mock IRequestChannel. Таким образом, вы можете сосредоточить свой модульный тест только на специфике тестируемого метода, а не на создании гигантского теста, который создает реальные примеры всего и т. Д. ), Инверсия управления (IoC) и инъекция зависимостей (в основном подмножество IoC).

B) Я бы сказал, что вы обычно хотите использовать фабричный шаблон между слоями, а не внутри слоев. Например. ваш сервисный уровень будет реализовывать фабрику для классов вашего репозитория. Таким образом, если ваш ICustomerRepostory изменится с NHibernateCustomerRepository на CouchDBCustomerRespository ... ваш уровень обслуживания не должен ничего знать об этом изменении.

Другой автор ответил на другие вопросы, я думаю ... поэтому я оставлю C & D в покое.

РЕДАКТИРОВАНИЕ ОТВЕТА:

Так вы бы согласились, что если ChannelFactory.CreateChannel всегда вернул экземпляр того же конкретный тип, независимо от значения привязки и адреса, затем У ChannelFactory не будет фабрики шаблон реализован?

Извините, вероятно, над моей головой, что касается его семантики ... но, насколько я понимаю, вопрос не столько в том, что он возвращает более одного конкретного класса, но в его способности возвращать другой конкретный класс если возникнет необходимость. Если он не способен производить разные конкретные классы, то это не будет фабрика ... но если он "может" производить разные конкретные классы, если и когда возникнет такая необходимость, тогда это фабричный образец. Кроме того, мне придется объявить о невежестве ... и даже в этом я не говорю, что не могу ошибаться.

1 голос
/ 26 октября 2010

Шаблон Factory используется для возврата конкретной реализации более общего класса / интерфейса.

В этом случае ChannelFactory возвращает конкретную реализацию IRequestChannel. Нигде в вашем коде вы не указываете фабрике, какой конкретный класс возвращать, что делает эту фабрику. Что касается ваших очков:

a) Часто считается хорошей практикой кодирования возвращать наименее конкретный возможный тип. Если вам удастся вернуть экземпляр интерфейса, сделайте это. Это уменьшит головные боли при обслуживании в будущем.

Имейте в виду, что возврат наименее определенного типа не имеет ничего общего с шаблоном Factory. Шаблон Фабрика относится к созданию экземпляра объекта.

b) Шаблон Factory не обязательно должен указывать тип создаваемого бетона. Это также позволяет заводу определять тип бетона на основе переданных ему параметров (в данном случае binding и address).

c) Да, ChannelFactory реализует шаблон Factory.

...