<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: OBSEV:: Fluent Interface and c# 3.0 Extension Methods : The flexibility of dynamic typing with the powerfull AutoCompletion</title>
	<atom:link href="http://sadekdrobi.com/2007/01/07/obsev-fluentinterface-and-c-30-extension-methods-the-flexibility-of-dynamic-typing-with-the-powerfull-autocompletion/feed/" rel="self" type="application/rss+xml" />
	<link>http://sadekdrobi.com/2007/01/07/obsev-fluentinterface-and-c-30-extension-methods-the-flexibility-of-dynamic-typing-with-the-powerfull-autocompletion/</link>
	<description>Sadek Drobi</description>
	<lastBuildDate>Mon, 02 Nov 2009 05:56:20 +0100</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: jhonny</title>
		<link>http://sadekdrobi.com/2007/01/07/obsev-fluentinterface-and-c-30-extension-methods-the-flexibility-of-dynamic-typing-with-the-powerfull-autocompletion/comment-page-1/#comment-8761</link>
		<dc:creator>jhonny</dc:creator>
		<pubDate>Mon, 16 Feb 2009 17:34:47 +0000</pubDate>
		<guid isPermaLink="false">http://sadekdrobi.com/?p=22#comment-8761</guid>
		<description>&quot;reflection can be used inside the extension methods to discover properties that belong to the concrete class, and not only the interface.&quot;
You can avoid this using a combination of the builder pattern with generics and generic extension methods with generic constraints.
As an added benefit you&#039;ll have compile time type safety.
I&#039;ve blogged about it here:  
&lt;a href=&quot;http://withasmiletomeltathousandhearts.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time/&quot; rel=&quot;nofollow&quot;&gt;http://withasmiletomeltathousandhearts.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time/&lt;/a&gt;</description>
		<content:encoded><![CDATA[<p>&#8220;reflection can be used inside the extension methods to discover properties that belong to the concrete class, and not only the interface.&#8221;<br />
You can avoid this using a combination of the builder pattern with generics and generic extension methods with generic constraints.<br />
As an added benefit you&#8217;ll have compile time type safety.<br />
I&#8217;ve blogged about it here:<br />
<a href="http://withasmiletomeltathousandhearts.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time/" rel="nofollow">http://withasmiletomeltathousandhearts.wordpress.com/2009/02/16/fluent-interfaces-constraints-at-compile-time/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Troy DeMonbreun</title>
		<link>http://sadekdrobi.com/2007/01/07/obsev-fluentinterface-and-c-30-extension-methods-the-flexibility-of-dynamic-typing-with-the-powerfull-autocompletion/comment-page-1/#comment-706</link>
		<dc:creator>Troy DeMonbreun</dc:creator>
		<pubDate>Mon, 24 Sep 2007 19:10:19 +0000</pubDate>
		<guid isPermaLink="false">http://sadekdrobi.com/?p=22#comment-706</guid>
		<description>I wrote a article showing some &quot;quick example&quot; code illustrating how to build a (non-extended) Fluent Interface in C#:

http://blog.troyd.net/PermaLink,guid,5cdd4862-857a-488d-a577-c6d21b548f19.aspx

Thanks,
Troy</description>
		<content:encoded><![CDATA[<p>I wrote a article showing some &#8220;quick example&#8221; code illustrating how to build a (non-extended) Fluent Interface in C#:</p>
<p><a href="http://blog.troyd.net/PermaLink,guid,5cdd4862-857a-488d-a577-c6d21b548f19.aspx" rel="nofollow">http://blog.troyd.net/PermaLink,guid,5cdd4862-857a-488d-a577-c6d21b548f19.aspx</a></p>
<p>Thanks,<br />
Troy</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Console.Write(this.Opinion) : Interfaces fluentes</title>
		<link>http://sadekdrobi.com/2007/01/07/obsev-fluentinterface-and-c-30-extension-methods-the-flexibility-of-dynamic-typing-with-the-powerfull-autocompletion/comment-page-1/#comment-31</link>
		<dc:creator>Console.Write(this.Opinion) : Interfaces fluentes</dc:creator>
		<pubDate>Thu, 08 Mar 2007 12:51:09 +0000</pubDate>
		<guid isPermaLink="false">http://sadekdrobi.com/?p=22#comment-31</guid>
		<description>[...] Interfaces fluentes   Escrevendo a minha da prÃ³xima revista Mundo.Net, sobre ferramentas de Mock, tive contato com as interfaces fluentes. O Rhino Mocks permite que vocÃª estabeleÃ§a as expectativas do mock em uma interface fluente. Veja como fica o cÃ³digo:  &#160;&#160;&#160;&#160;Expect.Call(MailerMock.SendMessage(&quot;mail@host.com&quot;)).IgnoreArguments().Return(5);&#160;&#160;&#160;&#160;//a mesma chamada em um layout mais fÃ¡cil de entender&#160;&#160;&#160;&#160;Expect.Call(MailerMock.SendMessage(&quot;mail@host.com&quot;))&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.IgnoreArguments()&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.Return(5); Ao invÃ©s de criar vÃ¡rios objetos e incluir cada objeto em uma propriedade do objeto principal, vocÃª simplesmente vai chamando os mÃ©todos um apÃ³s o outro. Fica muito mais fÃ¡cil de escrever o cÃ³digo, com menos linhas, e muito mais fÃ¡cil de ler. Ã‰ quase como uma frase separada por vÃ­rgulas. Com o cÃ³digo acima, por exemplo, vocÃª espera uma chamada no mÃ©todo SendMessage do objeto MailerMock, nÃ£o quer validar os argumentos recebidos e quer forÃ§ar o retorno da chamada seja igual a 5. Achei bem interessante e resolvi implementar o exemplo que o Martin Fowler mostra no seu post sobre o assunto. Ele mostra o exemplo de uma criaÃ§Ã£o de uma ordem de compra em uma linha de cÃ³digo. A coisa Ã© mais simples do que parece a primeira vista. Comecei implementando as classes Customer, Order e OrderLine. Cada um tem suas propriedades, como nome, endereÃ§o de entrega, etc. O customer tem um mÃ©todo NewOrder que retorna um objeto Order. AtÃ© ai o cÃ³digo Ã© â€œnormalâ€, entÃ£o tenho que criar o mÃ©todo With, que recebe os dados para criar uma OrderLine. O pulo do gato Ã© retornar o prÃ³prio o objeto Order no mÃ©todo. O mÃ©todo ShipTo segue o mesmo princÃ­pio, recebe o endereÃ§o, grava na variÃ¡vel e retorna o this.  &#160;&#160;&#160;&#160;public class Customer&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private string _name;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public string Name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;get { return _name; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public Customer(string name)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_name = name;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public Order NewOrder()&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return new Order(this);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;public class Order&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private Customer _customer;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private List&lt;OrderLine&gt; _orderLines;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private string _shipToAddress;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public Customer Customer&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;get { return _customer; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public List&lt;OrderLine&gt; OrderLines&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;get { return _orderLines; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public string ShipToAddress&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;get { return _shipToAddress; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public Order(Customer customer)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_orderLines = new List&lt;OrderLine&gt;();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_customer = customer;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public Order With(int itemId, float itemPrice)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_orderLines.Add(new OrderLine(itemId, itemPrice));&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return this;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public Order ShipTo(string address)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_shipToAddress = address;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return this;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;public class OrderLine&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private int _itemId;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private float _itemPrice;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public int ItemId&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;get { return _itemId; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public float ItemPrice&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;get { return _itemPrice; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public OrderLine(int itemId, float itemPrice)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_itemId = itemId;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_itemPrice = itemPrice;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;} A criaÃ§Ã£o da ordem tanto pode ser no mÃ©todo tradicional como utilizando a interface fluente, como mostra o cÃ³digo abaixo.  &#160;&#160;&#160;&#160;//Modo tradicional&#160;&#160;&#160;&#160;Customer cust = new Customer(&quot;Other Customer&quot;);&#160;&#160;&#160;&#160;Order order = cust.NewOrder();&#160;&#160;&#160;&#160;order.OrderLines.Add(new OrderLine(1, 5.0F));&#160;&#160;&#160;&#160;order.OrderLines.Add(new OrderLine(2, 9.4F));&#160;&#160;&#160;&#160;order.ShipTo(&quot;My address&quot;);&#160;&#160;&#160;&#160;//Modo fluente&#160;&#160;&#160;&#160;Customer cust = new Customer(&quot;My Customer&quot;);&#160;&#160; Order order = cust.NewOrder()&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.With(1, 10.0F)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.With(2, 12.3F)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.ShipTo(&quot;My address&quot;); Bom, nÃ£o foi tÃ£o difÃ­cil em um exemplo simples, a coisa pode ficar bem mais complicada quando vocÃª quer forÃ§ar uma ordem para as chamadas ou limitar a quantidade de vezes que um mÃ©todo pode ser chamado. Algumas aplicaÃ§Ãµes interessantes de interfaces fluentes:  Rhino mocks â€“ Mock object framework Readable regular expressions â€“ um wrapper muito maneiro da API de regex do .Net Framework Fluent control container â€“ Uma forma alternativa de instanciar controles ASP.Net Posts sobre aplicaÃ§Ã£o prÃ¡tica de interfaces fluentes:   A simple example of a fluent interface - Jon Galloway  The Specification Pattern â€“ Jeff Perrin  Fluent Interface and c# 3.0 Extension Methods - Sadek Drobi &#160; [...]</description>
		<content:encoded><![CDATA[<p>[...] Interfaces fluentes   Escrevendo a minha da prÃ³xima revista Mundo.Net, sobre ferramentas de Mock, tive contato com as interfaces fluentes. O Rhino Mocks permite que vocÃª estabeleÃ§a as expectativas do mock em uma interface fluente. Veja como fica o cÃ³digo:  &nbsp;&nbsp;&nbsp;&nbsp;Expect.Call(MailerMock.SendMessage(&#8221;mail@host.com&#8221;)).IgnoreArguments().Return(5);&nbsp;&nbsp;&nbsp;&nbsp;//a mesma chamada em um layout mais fÃ¡cil de entender&nbsp;&nbsp;&nbsp;&nbsp;Expect.Call(MailerMock.SendMessage(&#8221;mail@host.com&#8221;))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.IgnoreArguments()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Return(5); Ao invÃ©s de criar vÃ¡rios objetos e incluir cada objeto em uma propriedade do objeto principal, vocÃª simplesmente vai chamando os mÃ©todos um apÃ³s o outro. Fica muito mais fÃ¡cil de escrever o cÃ³digo, com menos linhas, e muito mais fÃ¡cil de ler. Ã‰ quase como uma frase separada por vÃ­rgulas. Com o cÃ³digo acima, por exemplo, vocÃª espera uma chamada no mÃ©todo SendMessage do objeto MailerMock, nÃ£o quer validar os argumentos recebidos e quer forÃ§ar o retorno da chamada seja igual a 5. Achei bem interessante e resolvi implementar o exemplo que o Martin Fowler mostra no seu post sobre o assunto. Ele mostra o exemplo de uma criaÃ§Ã£o de uma ordem de compra em uma linha de cÃ³digo. A coisa Ã© mais simples do que parece a primeira vista. Comecei implementando as classes Customer, Order e OrderLine. Cada um tem suas propriedades, como nome, endereÃ§o de entrega, etc. O customer tem um mÃ©todo NewOrder que retorna um objeto Order. AtÃ© ai o cÃ³digo Ã© â€œnormalâ€, entÃ£o tenho que criar o mÃ©todo With, que recebe os dados para criar uma OrderLine. O pulo do gato Ã© retornar o prÃ³prio o objeto Order no mÃ©todo. O mÃ©todo ShipTo segue o mesmo princÃ­pio, recebe o endereÃ§o, grava na variÃ¡vel e retorna o this.  &nbsp;&nbsp;&nbsp;&nbsp;public class Customer&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private string _name;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return _name; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Customer(string name)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_name = name;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Order NewOrder()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Order(this);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public class Order&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private Customer _customer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private List&lt;OrderLine&gt; _orderLines;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private string _shipToAddress;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Customer Customer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return _customer; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public List&lt;OrderLine&gt; OrderLines&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return _orderLines; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public string ShipToAddress&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return _shipToAddress; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Order(Customer customer)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_orderLines = new List&lt;OrderLine&gt;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_customer = customer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Order With(int itemId, float itemPrice)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_orderLines.Add(new OrderLine(itemId, itemPrice));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Order ShipTo(string address)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_shipToAddress = address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public class OrderLine&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private int _itemId;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private float _itemPrice;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public int ItemId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return _itemId; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public float ItemPrice&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get { return _itemPrice; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public OrderLine(int itemId, float itemPrice)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_itemId = itemId;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_itemPrice = itemPrice;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;} A criaÃ§Ã£o da ordem tanto pode ser no mÃ©todo tradicional como utilizando a interface fluente, como mostra o cÃ³digo abaixo.  &nbsp;&nbsp;&nbsp;&nbsp;//Modo tradicional&nbsp;&nbsp;&nbsp;&nbsp;Customer cust = new Customer(&#8221;Other Customer&#8221;);&nbsp;&nbsp;&nbsp;&nbsp;Order order = cust.NewOrder();&nbsp;&nbsp;&nbsp;&nbsp;order.OrderLines.Add(new OrderLine(1, 5.0F));&nbsp;&nbsp;&nbsp;&nbsp;order.OrderLines.Add(new OrderLine(2, 9.4F));&nbsp;&nbsp;&nbsp;&nbsp;order.ShipTo(&#8221;My address&#8221;);&nbsp;&nbsp;&nbsp;&nbsp;//Modo fluente&nbsp;&nbsp;&nbsp;&nbsp;Customer cust = new Customer(&#8221;My Customer&#8221;);&nbsp;&nbsp; Order order = cust.NewOrder()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.With(1, 10.0F)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.With(2, 12.3F)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ShipTo(&#8221;My address&#8221;); Bom, nÃ£o foi tÃ£o difÃ­cil em um exemplo simples, a coisa pode ficar bem mais complicada quando vocÃª quer forÃ§ar uma ordem para as chamadas ou limitar a quantidade de vezes que um mÃ©todo pode ser chamado. Algumas aplicaÃ§Ãµes interessantes de interfaces fluentes:  Rhino mocks â€“ Mock object framework Readable regular expressions â€“ um wrapper muito maneiro da API de regex do .Net Framework Fluent control container â€“ Uma forma alternativa de instanciar controles ASP.Net Posts sobre aplicaÃ§Ã£o prÃ¡tica de interfaces fluentes:   A simple example of a fluent interface &#8211; Jon Galloway  The Specification Pattern â€“ Jeff Perrin  Fluent Interface and c# 3.0 Extension Methods &#8211; Sadek Drobi &nbsp; [...]</p>
]]></content:encoded>
	</item>
</channel>
</rss>

