--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
[NHSession]public Product Retrieve(int id) {var prod = NHContext.Session.Get<Product>(id);return prod;}[NHTransaction]public void Update(Product prod)NHContext.Session.Update(prod);}O código do interceptor que inspeciona os attributos e trata session/transaction é simples: https://github.com/bfiorentino/P1/blob/master/src/P1/P1.NHibernate/NHSessionInterceptor.cs
Esses Anotations eram diferentes desses dois, derrepente, nesses ai o escopo se completa ao final do método, não era nosso caso.
Sempre que conversamos sobre um Framework arquitetural, ou sobre arquiteturas pré-definidas, com ferramentas pré-selecionadas, ainda que exista a flexibilidade (eu dei uma olhada na home do git) acha que exista uma abordagem onde isto não seja uma forma de não avaliar complexidade que pode ser desnecessária?
Bruno,
Estou aprendendo arquitetura para Web e acho interessante o projeto para resolver algumas dúvidas que tenho.
O exemplo que tem no git parece que é um simples cadastro de um produto, abaixo pequeno trecho
das classes que dá para outras pessoas entenderem.
public class Product : Entity<int> {
[Length(50)] public virtual string Name { get; set; } [Range(1, 100)] public virtual int Number { get; set; } }
public class ProductsController : Controller {
private readonly IProductsService productsService;
public ProductsController(IProductsService productsService) {
this.productsService = productsService;
}
public ActionResult Create(Product prod) {
var id = this.productsService.Create(prod);
return this.RedirectToAction("retrieveall");
}
public class DefaultProductsService : IProductsService { [NHTransaction] [Authorize(SecurityNames.Operations.App_ProductsService_Create)] public int Create(Product prod) { NHContext.Session.Save(prod); NHContext.Session.Flush(); return prod.Id;}
Vou começar com algumas dúvidas que tenho:
1) O que chama de Service seria o mesmo que muitos chamam de Repositório. Seria apenas para acessar o banco ou colocaria alguma regra de negócio neste serviço ?
2) Aonde faria uma validação do tipo não permitir a criação de dois produtos com o mesmo número ( Number ), no Service ? Gostaria de fazer validação via consulta do Nhibernate e não usar por exemplo o um índice no banco de dados.
Ricardo
1) O que chama de Service seria o mesmo que muitos chamam de Repositório. Seria apenas para acessar o banco ou colocaria alguma regra de negócio neste serviço?
Não é repositório. É um Application Service. Delimita transações e orquestra outros componentes de negócio, incluindo repositórios, se você usa esse padrão.
2) Aonde faria uma validação do tipo não permitir a criação de dois produtos com o mesmo número ( Number ), no Service ? Gostaria de fazer validação via consulta do NHibernate e não usar por exemplo o um índice no banco de dados.
Mas o foda de tudo isso é que vc nem começou a codar e seu proj já ta parecendo uma arvore de natal.
Então aqui está uma oportunidade para enfatizar: antes de considerar essa stack, é preciso querer/precisar usar ORM, por exemplo. Não só ORM, mas todo ou quase todo o resto (IoC/DI, etc.) em conjunto. Caso contrário, antes de partir pra outra, como não é exatamente tudo ou nada, restam as seguintes alternativas:
- Dar um unload nas libs q não lhe interessam e, se não quebrar nada -- em vários casos não quebra --, seguir em frente *mais leve*. Homework de quem se interessar. Não criei todas as possibilidades de SampleProject, nem pretendo.
- Extrair um componente ou outro que agregue valor na sua solução "custom". O código está disponível.
Eu mesmo penso em consumir esses componentes dessas 3 maneiras.
Os projetos não eram todos no mesmo molde, tampouco eram combinações dos bloquinhos do framework. Nós só o usávamos porque era o único martelo que tinhamos.
Comecei a perceber o quanto frameworks arquiteturais eram ruins quando percebi que não usava o que eu mesmo havia feito para os meus projetos. Quando percebi que o framework me limitava a um design pré-pensado. Que era mais útil para programadores que tem preguiça de modelar. Mais ainda, quando eu percebi que as bibliotecas que eu achava tão lindas no começo, já não eram tão mais lindas assim.
Com o tempo, todos nós evoluímos enquanto programadores. Os frameworks tem mais dificuldade de evoluir.
NHSessionManager nhSessionManagerStorage = null;
NHSessionManagerInitializer.Initialize(new InlineableStorage<NHSessionManager>(() => nhSessionManagerStorage, value => nhSessionManagerStorage = value));
NHSessionManagerInitializer.Initialize(new InlineableStorage<NHSessionManager>(() => (NHSessionManager)HttpContext.Current.Items[nhSessionManagerKey],value => HttpContext.Current.Items[nhSessionManagerKey] = value));
The motivation to build P1 was to provide a simple, lightweight and productive architectural framework for .NET based solutions -- not only for web/frontend. P1 aggressively automates repetitive tasks helping to reduce error prone and boilerplate code (...)
The design mindset regarding P1 features was they should be useful for at least 80% of a solution built on top of it and unused features should get out of the way. P1 can be seen as a tool box. Most features are optional/skippable. The full feature set is recommended, but dependencies were minimized, this way choices can be made or components can be easily extracted and adapted.
(...) P1 can be seen as a tool box. Most features are optional/skippable. The full feature set is recommended, but dependencies were minimized, this way choices can be made or components can be easily extracted and adapted. (...)
Então aqui está uma oportunidade para enfatizar: antes de considerar essa stack, é preciso querer/precisar usar ORM, por exemplo. Não só ORM, mas todo ou quase todo o resto (IoC/DI, etc.) em conjunto. Caso contrário, antes de partir pra outra, como não é exatamente tudo ou nada, restam as seguintes alternativas:
- Dar um unload nas libs q não lhe interessam e, se não quebrar nada -- em vários casos não quebra --, seguir em frente *mais leve*. Homework de quem se interessar. Não criei todas as possibilidades de SampleProject, nem pretendo.
- Extrair um componente ou outro que agregue valor na sua solução "custom". O código está disponível.
Eu mesmo penso em consumir esses componentes dessas 3 maneiras.
UNLOAD seguido de REMOVE.
Ricardo,1) O que chama de Service seria o mesmo que muitos chamam de Repositório. Seria apenas para acessar o banco ou colocaria alguma regra de negócio neste serviço?
Não é repositório. É um Application Service. Delimita transações e orquestra outros componentes de negócio, incluindo repositórios, se você usa esse padrão.
2) Aonde faria uma validação do tipo não permitir a criação de dois produtos com o mesmo número ( Number ), no Service ? Gostaria de fazer validação via consulta do NHibernate e não usar por exemplo o um índice no banco de dados.Fica a teu critério como e quando encapsular queries e regras de negócio. A única coisa que o projeto te obriga a fazer, da maneira como as coisas estão organizadas, é manter o atributo NHSession -- ou NHTransaction -- na operação do serviço. Quando um método de um componente que encapsula uma query, por exemplo, for executado o contexto estará disponível -- basta chamar NHContext.Session na implementação deste componente.2012/2/7 RicardoBruno,
Estou aprendendo arquitetura para Web e acho interessante o projeto para resolver algumas dúvidas que tenho.
O exemplo que tem no git parece que é um simples cadastro de um produto, abaixo pequeno trecho
das classes que dá para outras pessoas entenderem.
public class Product : Entity<int> {[Length(50)]public virtual string Name { get; set; }[Range(1, 100)]public virtual int Number { get; set; }}
public class ProductsController : Controller {
private readonly IProductsService productsService;
public ProductsController(IProductsService productsService) {
this.productsService = productsService;
}
public ActionResult Create(Product prod) {
var id = this.productsService.Create(prod);
return this.RedirectToAction("retrieveall");
}
public class DefaultProductsService : IProductsService {[NHTransaction][Authorize(SecurityNames.Operations.App_ProductsService_Create)]public int Create(Product prod) {NHContext.Session.Save(prod);NHContext.Session.Flush();return prod.Id;}
Vou começar com algumas dúvidas que tenho:
1) O que chama de Service seria o mesmo que muitos chamam de Repositório. Seria apenas para acessar o banco ou colocaria alguma regra de negócio neste serviço ?
2) Aonde faria uma validação do tipo não permitir a criação de dois produtos com o mesmo número ( Number ), no Service ? Gostaria de fazer validação via consulta do Nhibernate e não usar por exemplo o um índice no banco de dados.
Ricardo
--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetarchitects@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitects+unsubscribe@googlegroups.com
"Service Stack was heavily influenced by Martin Fowlers Data Transfer Object Pattern:
When you're working with a remote interface, such as Remote Facade (388), each call to it is expensive. As a result you need to reduce the number of calls, and that means that you need to transfer more data with each call. One way to do this is to use lots of parameters. However, this is often awkward to program - indeed, it's often impossible with languages such as Java that return only a single value.
The solution is to create a Data Transfer Object that can hold all the data for the call. It needs to be serializable to go across the connection. Usually an assembler is used on the server side to transfer data between the DTO and any domain objects."
"WCF the anti-DTO Web Services Framework
Unfortunately this best-practices convention is effectively discouraged by Microsoft's WCF SOAP Web Services framework as they encourage you to develop API-specific RPC method calls by mandating the use method signatures to define your web services API. This results in less re-usable, more client-sepcfic APIs that encourages more remote method calls."
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Abraço,
Diego Caxito
Analista de Sistemas
--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br
Amigo, Webforms pode ser uma merda para você e para a sua realidade (para os projetos que você trabalha), para outros, para outras realidades, para outros tipos de de projeto Web a ferramenta (WebForms) pode atender muito bem, e ai??
Você diz que quem usa WebForms tem que ouvir o que os mais sensatos dizem. Eu acho que sensatez nesta caso é avaliar se o meu projeto requer ser desenvolvido com ASP.NET MVC ou com WebForms. A propria MS não abandonou WebForms, esta trabalhando para aprimorar, isso não significa nada para você??
ASP.NET MVC veio para suprir um gap de Web Standars que o WebForms não suporta, por outro lado, tira sim muito da produtividade para o desenvolvimento de um projeto Web, onde os requisitos de operação, sejam de um ERP, por exemplo.
Trabalho hoje, num ERP que é WEB esta em desenvolvimento a 2,5 anos (muito, muito complexo) requisitos operacionais com peculiaridades do negócio, sem nenhuma necessidade de Web Standards pois o usuário é a propria empresa, a necessidade de ser Web é o acesso remoto dos colaboradores.
Juan,
É só uma zoação com a imensidade de frameworks para o Java... =]
Eu não conheço Java o suficiente para afirmar que ele é dependente de frameworks.
Eu posso hoje implementar no meu projeto Repository, DI, Testes e etc sem a necessidade de um "framework de frameworks".
Se o stack dele é engessado, me privará do poder de criação. Se o stack dele for flexível, vai se igualar as opções que já tenho hoje. No máximo dando uns 10% de produtividade.
Agora, como já disse, se ele adotar o stack dele como padrão de projetos para o time dele, legal. Acredito que o ganho de produtividade será maior.
Há uns meses atrás fiz um projeto semelhante de automatização de desenvolvimento e diminuimos 60% do esforço para desenvolver uma funcionalidade. Isso serviu pois é um sistema corporativo e queriamos definir padrões para os devs, logo facilitou a nossa padronização. Agora, se eu pego a aplicação de que desenvolvi e distribuo no mercado, será rejeitada pela maioria pois talvez não se aplicará ao contexto das pessoas.
antes do asp.net mvc, existia o alt.net, então a galera que senta o pau no webforms hoje, sentou o pau no webforms no passado.
Isto é arquitetura? Discutir qual a melhor tecnologia sem ter um contexto de produto como base? Menos pessoal... Ano que vem estaremos falando o quão Mvc é ruim e que XXX mudou o mundo... Menos...