5 Comments

Neko vrijeme razmišljam napraviti jednostavni Asp.net MVC web site čiju izradu bi mogao pokriti u nekoliko blog postova, ali najveći problem je osmisliti temu i ideju. Surfanjem uz jutarnju kavu naišao sam na  zanimljiv site UserVoice.com, i pomislio da bi bilo baš zgodno postaviti jedan account za našu polu-propalu vladu; neka ljudi glasaju za pitanja/probleme, i vlada jednostavno uzima one s najviše glasova i rješava ih! Naravno, to je čista utopija, ali i dobra podloga za spomenutu demo aplikaciju u MVC frameworku. Ne samo da je demo aplikacija za upoznavanje s MVC frameworkom, nego je korisna za cijelo društvo :)! Dovoljno jednostavna da se ne zapletem u poslovnu logiku i infrastrukturu, ali pokriva dovoljno featura frameworka da se povremeni developer može upoznati s njegovim mogućnostima. [more]

Brainstorming ideja:

  • posjetioci daju prijedloge
  • mogućnost glasanja za svaki prijedlog (do X glasova)
  • komentiranje
  • pregled prijedloga po broju glasova
  • pregled komentara
  • “zatvaranje” prijedloga kada isti bude napravljen od strane vladajuće garniture (ili kome će se već postavljati prijedlozi). Mislim da sa ovim featurom ne treba žuriti
  • precizirati što se želi od korisnika i kako se to postići: naglasak na izuzetno jednostavno sudjelovanje i korištenje sitea (usability prije svega)

Tehnologije: ASP.NET MVC, LINQ2SQL (Repository pattern da bi eventualno mogli zamijeniti za nHibernate), StructureMap (IoC/DI), FluentValidation, jQuery za AJAX, …?

Ideja za naziv: Glas Naroda

Grubi class diagram entiteta:

Pozivam vas sve da sa predložite svoju ideju za ovu demo aplikaciju!

1 Comments

Modificirajući ovaj blog engine (maštovitog imena blogengine.net), primijetio sam da nema ugrađen nikakav caching layer. Da slučajno 10-tak posjetioca bloga dnevno ne bi morali čekati učitavanje, morao sam pod hitno složiti jednostavnu klasu koju mogu upotrijebiti po potrebi bilo gdje u projektu.

Tako je nastalo ovo:

.net framework 2.0 verzija (blogengine.net je u .net 2):

public class CacheService<T> where T:class
{
    public delegate T CallbackHandler();

    public T Get(string key, CallbackHandler callback,DateTime? expiration)  
    {
        T item = HttpContext.Current.Cache[key] as T;
        if (item == null)
        {
            item = callback() as T;
            if(expiration==null)
                HttpContext.Current.Cache.Insert(key,item, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration);
            else
                HttpContext.Current.Cache.Insert(key, item, null, expiration.Value, Cache.NoSlidingExpiration);
        }
        return item;
    }
}

ili .net 3/3.5 verzija [more], gdje je malo lakše raditi sa delegatima koji vračaju objekt (.net 2 ima dva "predefinirana" delegata, Action, koji je vraća ništa, i Predicate koji vraća bool vrijednost):

public class CacheService
{
    public T Get(string key, Func<T> callback,DateTime? expiration) where T:class
    {
        T item = HttpContext.Current.Cache[key] as T;
        if (item == null)
        {
            item = callback() as T;
            if(expiration==null)
                HttpContext.Current.Cache.Insert(key,item, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration);
            else
                HttpContext.Current.Cache.Insert(key, item, null, expiration.Value, Cache.NoSlidingExpiration);
        }
        return item;
    }
}

Upotreba u .net 2:

CacheService<List<category>> service= new CacheService<List<category>>;
List<category> list = service.Get("cats_menu",
	delegate { return Category.Categories; }, 
	DateTime.Now.AddMinutes(5));

i u .net 3/3.5 sa lambda izrazima:

var service= new CacheService();
var list = service.Get("cats_menu",
	()=> Category.Categories, 
	DateTime.Now.AddMinutes(5));

puno ljepše u novom frameworku, zar ne?