Il dado è tratto… :-)
Posted by mauro in Software Mason on Thursday 25 February 2010 at 11:44 PM
Da oggi una prima parte, il che presume che come minimo che ne sarà una seconda, del mio lavoro di questi ultimi anni diventa open source: http://radical.codeplex.com/, con licenza “Microsoft Public License (Ms-PL)”
Radical ha la velleità, e pure un po’ la pretesa :-), di essere un framework di supporto per lo sviluppo di applicazioni desktop, quindi Windows Forms e Wpf, e sta pian piano strizzando l’occhiolino anche a Silverlight, che sta entrando di prepotenza nella sfera delle mie passioni.
E’ da giorni che sto scrivendo questo post… che fatica :-)
Che cosa offre Radical?
Una quantità industriale di cose :-) cerchèrò di riassumerle a mo di indice qui:
Assembly: Radical; In ordine strettamente alfabetico…
- Change Tracking Service: no ho già parlato ma da quel post molto codice è passato sotto la tastiera :-) sta di fatto che c’è un’implementazione completa funzionante, e pure in produzone, di un sistema di ChangeTracking per le vostre entità, o come preferisco io per i ViewModel che wrappano le entity;
- Enumerations: attributi, anche con supporto per la localizzazione, per poter fare questo:
enum MyEnum { [EnumItemDescription( "sample caption", "some description...", 1 )] ValueXYZ, [EnumItemDescription( "caption", "description of what?", 0 )] MyOtherValue, }
e ove necessario estrarre questo:
var bindingData = EnumHelper.ExtractBindingData<MyEnum>(); foreach( var bd in bindingData ) { MyEnum value = bd.Value; String caption = bd.Caption; }
Se non ricordo male c’è anche un converter per Wpf che data una enum fa tutto il giochetto e la “binda” con un ItemsControl come ad esempio un ComboBox.
- Extensions: una quantità industriale di “entension method” per gli usi più disparati e per tutti i gusti, alcuni probabilmente spariranno perchè sono veramente inutili :-);
- Helpers: una discreta qantità di classi helper per semplificare la vita dello sviluppatore: dall’uso della command line alla creazione on the fly di fast delegate via lambda expression;
- Messaging: l’implementazione di un motore di message brokering;
-
Model:
-
Entity, EntityCollection
, MementoEntity, MementoEntityCollection : un set di classi base da utilizzarsi ad esempio, quelle Memento*, per avere gratis il supporto al motore di ChangeTracking scrivendo pochissimo, o addirttura niente nel caso delle collection, codice; qui ci sarebbe probabilente da parlare a lungo :-) -
EntityView: un’implementazione completa, e in produzione da tempo immemore, di IBindingListView e non solo, perchè ad esempio offre pieno supporto per le colonne calcolate, IEntityView
, e la sua implementazione di base EntityView , fa una montagna di cose senza scrivere una virgola di codice, e offre inoltre la possibilità, ereditando, di customizzare il compotamento fin nei minimi dettagli, anche qui potremmo parlarne per giorni :-). Non ho idea se e come possa funzionare con Silverlight, studio :-); -
Un’implementazione di Wrapper
che se funzionasse anche in scenari complessi sarebbe la manna… ma a quanto pare il gioco non vale la candela;
-
Entity, EntityCollection
-
Observers: un set di IMonitor
per semplificare la gestione di scenari di interazione complessi e potenzialmente contorti; - Threading/AsyncWorker: un’implementazione fluent di un wrapper per semplificare la gestione di scenari asincroni: c’è sia la versione vecchia che quella nuova, funzionalmente sono identitche ergo non ha senso usare quella vecchia;
- Validation: un piccolo, semplice e molto limitato framework per la validazione di entity, base ad esempio di un wapper per VAB di Enterprise Library;
- Validation/Ensure: un semplice kit per fare validazione dei parametri in maniera fluent e snella;
Assembly: Radical.Windows;
Assembly: Radical.Design;
Assembly: Radical.VisualStudio.UnitTesting;
Ho preso un test a caso in cui uso uno degli extension method: ShouldBeEqualTo
Assembly: Radical.Model.NHibernate;
Assembly: Radical.Validation.VAB;
Assembly: Radical.Extensions.Castle;
Ho elencato le cose degne di nota e probabilmente ne ho tralasciate parecchie.
Note:
le pos-build-action sono comunque abbastanza smart da controllare che la destinazione esista prima di eseguire l’azione in questo modo se la struttura di folder non c’è la post-build-action semplicemente non viene eseguita e la compilazione non fallisce per una stupidaggine :-)
.m
[TestMethod]
public void changeArgs_generic_ctor_normal_should_correctly_set_values()
{
var entity = new Object();
var cachedValue = new GenericParameterHelper();
var iChange = MockRepository.GenerateStub<IChange>();
var target = this.CreateMock<GenericParameterHelper>( entity, cachedValue, iChange );
target.Entity.ShouldBeEqualTo( entity );
target.CachedValue.ShouldBeEqualTo( cachedValue );
target.Source.ShouldBeEqualTo( iChange );
}
#1 da raffaeu Thursday February 2010 alle 08:50
Che dire ... grazie mille!!
#2 da Stefano Paparesta Thursday February 2010 alle 09:55
Spettacolo.... nient'altro da dire.
GRAZIE
#3 da petrux Thursday February 2010 alle 10:17
Fantastico!!! Ora però inventati qualcosa tipo aprire una mailing list o un canale IRC per il supporto ;-)
#4 da Antonio Thursday February 2010 alle 10:59
Grande Mauro,
a breve avrò l'occasione di provare il tuo nuovo progetto ; )
#5 da Mauro Servienti Thursday February 2010 alle 11:45
Supporto... che significa :-)
Scherzi a parte: http://radical.codeplex.com/Thread/List.aspx
.m
#6 da Gian Maria Friday February 2010 alle 05:35
Bello ;) grande MAuro, appena ho tempo me lo scarico :)
#7 da raffaeu Friday March 2010 alle 01:13
Se mi metti nel gruppo DEV ci scrivo (in Inglese) documentazione e progetti di esempio. :-P
#8 da Alessandro Giorgetti Friday March 2010 alle 07:15
Ma grazie..sono curioso di vedere come hai affrontato alcuni problemi che a me hanno fatto dannare :D