c#
EF 4.1 Cascade
1Olá pessoal, dessa vez o assunto será a configuração de deleção em cascata do EntityFramework 4.1. A motivação para criar o post foi a dúvida de alguns amigos no twitter, enquanto o time do EF não libera novidades pretendo escrever posts baseados nas dúvidas da galera, então vamos ao cascade.
1-Entidades
2-Contexto
A configuração da primeira entidade define um relacionamento um para n(hasmany() e withRequired()) e habilita a deleção em cascata
3-Exemplos
Dica
A configuração da deleção em cascata usando WillCascadeOnDelete() é dependente da configuração do relacionamento, é possível configurar o relacionamento de diferentes maneiras, caso o cascade não funciona a dica é rever a configuração de chaves estrangeiras e relacionamentos.
equals é diferente de ==
2Semana passada tive de resolver um bug e o problema era na comparação de objetos, será que usar obj1.Equals(obj2) é a mesma coisa que obj1==obj2 ?Considere o exemplo:
1: string name = default(String);
2: string nickName = default(String);
Exemplo 1:
1: if (name != nickName)
2: Console.WriteLine("Diferentes");
Exemplo 2:
1: if (!name.Equals(nickName))
2: Console.WriteLine("Diferentes");
Exemplo 3:
1: if (!nickName.Equals(name))
2: Console.WriteLine("Diferentes");
Qual o resultado? é a mesma coisa?
Usando funções C# no XML
0Olá pessoal, vamos ver como utilizar funções definidas em C# dentro de documentos XSLT.
Considere o simples xml abaixo:
1: <?xml version="1.0" encoding="utf-8" ?>
2: <entities>
3: <entity>
4: <name value="Carlos"></name>
5: </entity>
6: </entities>
Temos o seguinte XSLT com algumas chamas a funções:
1: <xsl:stylesheet version="2.0"
2: xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3: xmlns:fo="http://www.w3.org/1999/XSL/Format"
4: xmlns:xhtml="http://www.w3.org/1999/xhtml"
5: xmlns:xslFunctions="urn:MyXslExtensions"
6: >
7: <xsl:template match="entities/entity">
8: <xsl:value-of select ="xslFunctions:WriteMyContent()"/>
9: -
10: <xsl:value-of select ="xslFunctions:WriteEntityName(.)"/>
11: </xsl:template>
12:
13: </xsl:stylesheet>
Logo no cabeçalho podemos reparar uma nova definição:
1: xmlns:xslFunctions="urn:MyXslExtensions"
Aqui estou definindo um novo namespace de nome xslFunctions e defino que ele será encontrado na urn:urn:MyXslExtensions
O arquivo MyXslExtensions está no mesmo namespace mas vocês vão ver que poderia estar em qualquer outro, segue a definição do arquivo:
1: namespace XmlExtensionsUsingCSharp
2: {
3: public class MyXslExtensions
4: {
5: public String WriteMyContent()
6: {
7: return "MyXslExtensionstext";
8: }
9: public String WriteEntityName(System.Xml.XPath.XPathNodeIterator node)
10: {
11: var entityElements = node.Current.SelectChildren("name", "").GetEnumerator();
12: String text = String.Empty;
13: while (entityElements.MoveNext())
14: {
15: text += (entityElements.Current as XPathNavigator).GetAttribute("value", "");
16: }
17: return text;
18: }
19: }
20: }
1: XslTransform xsl = new XslTransform();
2:
3: //passando caminho do xslt
4: xsl.Load(AppDomain.CurrentDomain.BaseDirectory + "XsltFile.xslt");
5:
6: System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
7:
8: XmlWriter xmlWriter = new XmlTextWriter(memoryStream, System.Text.Encoding.Default);
9:
10: //Carregando as extensões customizadas
11: XsltArgumentList xsltArgumentList = new XsltArgumentList();
12: //adiciono uma extensão com a mesma urn definida no xslt
13: xsltArgumentList.AddExtensionObject("urn:MyXslExtensions", new MyXslExtensions());
14:
15: //Inicio a transformação
16:
17: XmlDocument xmlDocument = new XmlDocument();
18: xmlDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "XMLFile1.xml");
19: xsl.Transform(xmlDocument, xsltArgumentList, xmlWriter, null);
20:
21: Byte[] buffer = new Byte[memoryStream.Length];
22: buffer = memoryStream.ToArray();
23: String content = System.Text.Encoding.Default.GetString(buffer);
24: lblValue.Text = content;
Voltando ao xslt podemos ver as chamadas para as funções customizadas:
1: <xsl:value-of select ="xslFunctions:WriteMyContent()"/>
Apenas executamos uma função que retorna uma string
1: <xsl:value-of select ="xslFunctions:WriteEntityName(.)"/>
Executamos uma função que recebe o nó corrente como parâmetro e navega no mesmo usando Xpath para obter o atributo value do elemento name que é filho do elemento entity(elemento corrente no momento da execução)
Gerando código com templates T4 – Parte IGenerating code with T4 templates – Part I
0Hoje muito se ouve na comunidade .NET sobre templates T4.Não vou entrar no mérito de falar o que é pois vários blogs já o fizeram, você pode obter referências aqui, aqui e aqui. Eu mostrar um exemplo de como podemos gerar código sem conhecer muito do T4.
A ferramenta que vou usar é o VS2010 beta 2 com o add-on tangible t4 editor que pode ser baixado diretamente do visual studio.Para iniciar vamos criar uma solução clas library e adicionar um arquivo chamado
No exemplo abaixo vamos criar uma classe com o crud de uma entidade chamada pessoa. vamos usar LINQTOSQL para facilitar o exemplo.

Após criar o banco com a tabela pessoa vamos adicionar um arquivo t4 chamado crud.tt .
vs2010:Selecionar a opção general nos tipos de arquivos e selecionar o arquivo text template.
vs2008:Adicionar um arquivo com extensão .tt.
1-Vamos começar alterando a opção extension na tag output, vamos colocar .cs.
2- declarar variáveis para armazenar os dados que serão utilizados várias vezes pelo template
3- Adicionar os namespaces que serão utilizados pelo nosso CRUD
using System.Collections.Generic;
using System.Linq;
4- Declarar a classe responsável pelo CRUD
Galera, já temos nosso código CRUD básico, para gerar o mesmo código para outra classe basta mudar a variável NomeDaClasse e pronto!
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4:
5: namespace BlogT4
6: {
7: public class PessoaCRUD
8: {
9:
10: BlogT4DataDataContext db;
11:
12: public PessoaCRUD()
13: {
14: db = new BlogT4DataDataContext();
15: }
16:
17: public void Inserir(Pessoa entidade)
18: {
19: db.Pessoas.InsertOnSubmit(entidade);
20: db.SubmitChanges();
21: }
22:
23: public IQueryable<Pessoa> RecuperaTodasAsPessoas()
24: {
25: return db.Pessoas;
26: }
27:
28: }
29: }
no proximo post sobre T4 vamos melhorar as coisas e gerar código de maneira mais elegante! Até o próximo..
ps: o wordpres+ live writer estão sacaneando minha formatação..
Predicados, diferentes maneiras de obter o mesmo resultado
0Fala Galera, estava relembrando os diferentes tipos de delegates no .NET e comecei a escrever diferentes maneiras de obter o mesmo resultado utilizando predicados. segue o código de exemplo:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: List<Int32> lista = new List<Int32>();
6: lista.Add(1);
7: lista.Add(10);
8: lista.Add(9);
9: lista.Add(21);
10: lista.Add(4);
11: lista.Add(6);
12:
13:
14: //Diferentes maneiras de retornar todos os valores maiores que 10
15:
16:
17: Predicate<Int32> predicado1 = MaiorQue10; // setando método que será disparado
18: Predicate<Int32> predicado2 = x => { return x > 10; }; //setando método anônimo
19:
20: lista.FindAll(delegate(Int32 valor) { return valor > 10; }); //criando delegate e setando método
21: lista.FindAll(x => x > 10); //setando método anônimo direto
22: lista.FindAll(MaiorQue10); //setando método que será disparado
23: lista.FindAll(predicado1); //setando o predicado
24: lista.FindAll(predicado2); //setando o predicado
25:
26: }
27:
28: public static Boolean MaiorQue10(Int32 value)
29: {
30: return value > 10;
31: }
32:
33:
34:
35:
36:
37:
38: }
Hi people, I was remembering the different types of delegates in .NET so I started to write different ways to achieve the same result using predicates. Have a look at the code below
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: List<Int32> listaOfValues = new List<Int32>();
6: listaOfValues.Add(1);
7: listaOfValues.Add(10);
8: listaOfValues.Add(9);
9: listaOfValues.Add(21);
10: listaOfValues.Add(4);
11: listaOfValues.Add(6);
12:
13:
14:
15:
16:
17: Predicate<Int32> predicate1 = GreaterThan10; //setting the method that will be called
18: Predicate<Int32> predicate2 = x => { return x > 10; }; //setting anonymous method
19:
20: listaOfValues.FindAll(delegate(Int32 valor) { return valor > 10; }); // creating delegate and setting method
21: listaOfValues.FindAll(x => x > 10); //setting the anonimous method
22: listaOfValues.FindAll(GreaterThan10); //setting the method that will be called
23: listaOfValues.FindAll(predicate1); //setting the predicate
24: listaOfValues.FindAll(predicate2); //setting the predicate
25:
26: }
27:
28: public static Boolean GreaterThan10(Int32 value)
29: {
30: return value > 10;
31: }
32:
33:
34:
35:
36:
37:
38: }
Métodos de extensão, adicionando código a interfaces
0Fala Galera, não sei se fui muito pragmatico durante o aprendizado das novidades do C# 3.0 ou se apenas não fiz uso de boas fontes de informação. O fato é que eu não sabia do real poder dos métodos de extensão, eles podem ser adicionados a interfaces. Sendo assim é possível realizar aquele sonho de criar um código comum sem “gastar” a herança e sem o “overload” da delegação.
Eu sempre ficava confuso com relação a criação de métodos de extensão e métodos de instancia, agora sei um bom motivo para fazer a distinção. Ainda fiquei sabendo que grande parte dos métodos que usamos do LINQ foram adicionados a interfaces, como exemplo temos os métodos de IQueryable. sabendo disso, segue o código de exemplo:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: IAutomovel automovel = new Carro();
6: automovel.Acelerar();
7:
8: Console.ReadKey();
9: }
10: }
11:
12:
13: public static class ExtensionAdditions
14: {
15: public static void Acelerar(this IAutomovel automovel)
16: {
17: //acelerando
18: Console.WriteLine("Acelerando");
19: }
20: }
21:
22: public interface IAutomovel
23: {
24: }
25:
26: public class Carro : IAutomovel
27: {
28:
29: }
30:
31: public class Moto : IAutomovel
32: {
33:
34: }
Hello fellas, I don’t know if I was too pragmatic while I was learning about the new features of C# 3.0 or If I just didn’t find the best resources to learn. The fact is that until I read this book I didn’t know about the real power of extension methods, they can be added to interfaces. Therefore is possible to satisfy the old desire of develop some “generic” code without “spend” inheritance and don’t have some tasks making delegation.
Every time I had to create an extensions method, I was confuse about the difference between extension methods and objects methods. Now I can say that I’ve a good reason to make some distinction about them. In addition to it I learnt that almost all methods I’ve been using when working with LINQTOSQL were made using this kind of code. So, lets have a look at this example:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: IVehicle vehicle = new Car();
6: vehicle.Accelerate();
7:
8: Console.ReadKey();
9: }
10: }
11:
12:
13: public static class ExtensionAdditions
14: {
15: public static void Accelerate(this IVehicle automovel)
16: {
17: //acelerando
18: Console.WriteLine("increasing speed");
19: }
20: }
21:
22: public interface IVehicle
23: {
24: }
25:
26: public class Car : IVehicle
27: {
28:
29: }
30:
31: public class motorcycle : IVehicle
32: {
33:
34: }
So friends I hope it helps!
Release 0.3 do gateway de pagamento locaweb
2Fala Galera, finalmente liberei o release 0.3 da API de integração com o gateway de pagamento locaweb. Este release contém muitas novidades. Acho que a principal novidade foi a reformulação da solução para suportar vários módulos de pagamento.Além disso este release apresenta os seguintes módulos homologados
- VISAVBV
- REDECARD
Além da homologação diversas melhorias na solução foram realizadas, as melhorias notáveis foram:
- comentários nas funções
- construção inicial da documentação
- controle mais eficiente da visibilidade dos componentes
- maior organização dos componentes em pastas e namespaces
O release 0.4 deve conter melhorias no código e liberação de todas as formas básicas de pagamento(VISA,REDECARD,AMEX) , além da criação da documentação para cada módulo.
links:
formas homologadas


ps: source code is available only in portugueseHello folks, I’ve just released the version 0.3 of API de integração com o gateway de pagamento locaweb. It was about time, I’ve been working in this release since wo weeks ago, just today I could release it. I’ve to teel that this release contains a lot of things that have not been planned so I spend more time on these additions. I think that the most valuable addition is that now the solution supports more than one module, so now It can has some others implementations for example Oi paggo.Besides this technical change these following modules were released:
- VISAVBV
- REDECARD
The mains improvements in this solution were:
- All methods were docummented with its own comment
- Initial production of general documentation
- improvements in the scope of components
- Creation of namespaces and foldes to improve the solution
The release 0.4 contains some code improvements and all basic payment methods(VISA,REDECARD,AMEX) besides the documentation for each module
links:
available methods


usando friend assembly .NET
0Fala Galera, estava trabalhando na API de gateway de pagamento e me encontrei na seguinte situação: Estou construindo uma DLL(Class Library) e gostaria de testar alguns métodos desta API no meu projeto de Testes. O problema está na visibilidade dos elementos, minha API tem a maioria das classes declaradas como internal. Logo não são acessíveis em outros assemblies, a não ser que você utiliza o conceito de Friend Assembly.
Friend assembly, como o nome já diz consiste em declarar um assembly como amigo, um assembly amigo tem acesso as classes declaradas como internal. Para fazer isso é muito simples, segue o código abaixo de exemplo que deve ser acessado por outro assembly
1: using System.Runtime.CompilerServices;
2:
3: [assembly: InternalsVisibleTo("ConsoleApplication")]
4:
5: namespace ClassLibrary
6: {
7: internal class SampleClass
8: {
9:
10: public void DoSomething()
11: {
12: // Do Something
13: }
14: }
15: }
A diretiva assembly:InternalVisibleTo indica qual o nome do assembly que pode acessar as classes internas.
Pesquisei pouco mais vi que existem muitas soluções para fazer isso, algumas usando reflexão e outras simples como esta apresentada. No meu caso fiquei com essa pela facilidade de implementar. está ai a dica, se um dia passar pelo mesmo problema.. Boa semana!Hello Folks, I was working in my new OpenSource project, API de gateway de pagamento da locaweb, when I had to solve one problem. In this project I have a class library and I’m writing some unit tests in another project called tests. The problem is when I try to access some internal class defined in the API library. These classes aren’t accessible, so I came up with to use friend assembly.
Friend assembly, is a kind of relationship that you can create between assemblies, one of related assemblies has access to internal methods of the related assembly. make this configuration is really easy, look the code below
1: using System.Runtime.CompilerServices;
2:
3: [assembly: InternalsVisibleTo("ConsoleApplication")]
4:
5: namespace ClassLibrary
6: {
7: internal class SampleClass
8: {
9:
10: public void DoSomething()
11: {
12: // Do Something
13: }
14: }
15: }
The directive assembly:InternalVisibleTo indicates which of your assemblies can access the internal classes.
When I was looking for information I found that there are lot solutions to problems like this one I related. I chose this solution ‘cause it is simple one I found. I hope this helps
C#, Criando alias para generics
1Fala Galera, estou lendo o livro More Effective c#, 50 ways to improve your c# e aprendi uma técnica legal, Usar alias para tipos genéricos. Olhe o exemplo abaixo e veja como é mais elegante usar alias
1: /// <summary>
2: /// Tipo Genérico usado para demonstração
3: /// </summary>
4: /// <typeparam name="T"></typeparam>
5: /// <typeparam name="T2"></typeparam>
6: public class TipoGenerico<T, T2>
7: {
8: private T param1;
9: public T Param1
10: {
11: get { return param1; }
12: set { param1 = value; }
13: }
14:
15:
16: private T2 param2;
17: public T2 Param2
18: {
19: get { return param2; }
20: set { param2 = value; }
21: }
22:
23: public TipoGenerico(T param, T2 param2)
24: {
25: this.param1 = param;
26: this.param2 = param2;
27: }
28: }
Agora segue o exemplo normal de instanciação:
1: static void Main(string[] args)
2: {
3: TipoGenerico<String, Decimal> exemploUsandoAlias = new TipoGenerico<String, Decimal>("", 1);
4: }
Exemplo usando alias:
1: using AliasTipoGenerico = TipoGenerico<String, Decimal>; // Criando um alias para meu generic
2: class Program
3: {
4:
5: static void Main(string[] args)
6: {
7:
8: AliasTipoGenerico exemploUsandoAlias = new AliasTipoGenerico("", 1);
9: }
10: }
Gostou? considerando que se você espalha instanciação deste tipo pelo sistema a coisa pode ser ainda mais complicada achei o recurso legal.. certamente vou usar
Constantes X ReadOnly
1Fala Galera, no ultimo post que fiz um amigo leitor fez uma observação sobre o seguinte código
Ele falou que sobre Variáveis ReadOnly e static, assim que vi o comentário fiquei pensando no motivo para usar um ou outro, logo fui buscar alguma coisa e achei alguns esclarecimentos. A primeira coisa que achei legal é uma tabela comparativa:
Const
- Não pode ser declarada como estática
- Possui natureza estática
- Valor Obtido em tempo de compilação
- Inicializada somente na declaração
- Deve ser inicializada com um valor literal
- Pode ser usada em um comando Switch
ReadOnly
- Pode ser de instancia ou estática
- Valor obtido em execução
- Pode ser inicializada na declaração ou em outros códigos como construtores
- Pode ser inicializada com uma expressão
No meu exemplo de código ele poderia ser static readOnly, mas eu conheço o valor em tempo de programação, logo não tenho necessidade de usar readOnly, além disso tenho o valor da variável em compilação, menos uma coisa pra execução. Ainda procurei o motivo pelo qual const não podem ser declaradas como static, a explicação que encontrei foi que uma confusão poderia ser gerada pois lendo um código como o seguinte
O programador pode achar que const é um tipo específico de static, além da declaração ficar “feia”.
Fontes:
http://stackoverflow.com/questions/842609/why-does-c-not-allow-const-and-static-on-the-same-line
http://stackoverflow.com/questions/842590/static-constants-in-c
http://www.dotnetspider.com/forum/161710-How-declare-constant-variable-C.aspx
http://weblogs.asp.net/psteele/archive/2004/01/27/63416.aspx