środa, 25 stycznia 2012

Najważnie zasady podczas korzystania z MVVM


  1. Unikanie kodu w code-behind – w większości przypadków to, co kiedyś było robione w code-behind, można przenieść do ViewModel, 
  2. Zdarzenia powinny zostać zastąpione komendami, np. zamiast podpinać zdarzenie Click, należy skorzystać z komendy; oczywiście istnieją przypadki, w których zdarzenia są jedynym rozwiązaniem, 
  3. ViewModel powinien implementować interfejs INotifyPropertyChanged, 
  4. Dane z widoku powinny być powiązane z właściwościami w ViewModel, 
  5. W testach sam ViewModel powinien wystarczyć; widok jest tak naprawdę wizualizacją przeznaczoną dla użytkownika; użytkownik, chcąc skorzystać z logiki dostarczonej przez aplikację, wprowadza tekst np. za pomocą TextBox – w testach jednostkowych ustawiamy właściwość w VM i powinniśmy uzyskać taki sam efekt, 
  6. należy rozróżnić Model od ViewModel; model nie może zawierać żadnej logiki, związanej z widokiem; innymi słowy, model to czysta logika biznesowa, z kolei ViewModel zawiera już informacje o stanie widoku.

xUnit w Visual Studio

Problem: Jak uruchamiać testy xUnit prosto z Visual Studio? Rozwiązanie: http://xunitcontrib.codeplex.com/ - pobrać i wykonać instalacje według instrukcji.

poniedziałek, 23 stycznia 2012

Dołączenie plików js do sekcji head w Orchard

Problem: Jak dołączyć pliki js do sekcji head w pliku Layout.cshtml w Orchard?
Rozwiązanie:
Script.Include("libs/modernizr-2.0.6.min.js").AtHead();

Nadpisanie sekcji head w Orchard

Problem: Jak nadpisać sekcję head w Orchard?
Rozwiązanie: W katalogu moj_theme\views utworzyć plik Document.cshtml i zdefiniować własny head.

sobota, 15 października 2011

Fluent nhibernate i spring.net

Problem: Jak skonfigurować Fluent nhibernate z spring.net ?
Rozwiązanie:
1) Ustawić namespace dla klas, które mają być z mappowane w pliku konfiguracyjnym wykorzystując np. właściwość FluentNhibernateMappingAssemblies
2) Dodać klasy ręcznie
3) Wykorzystać refleksję.
using System;
using System.Linq;
using System.Reflection;
using FluentNHibernate.Cfg;
using NHibernate.Cfg;
using ParametersModel.Mappings;
using Spring.Data.NHibernate;
 
namespace ParametersDoaNh.Base
{
    public class FluentNhibernateLocalSessionFactoryObject : LocalSessionFactoryObject
    {
        public string[] FluentNhibernateMappingAssemblies
        {
            get;
            set;
        }
 
        protected override void PostProcessConfiguration(ref Configuration config)
        {
            base.PostProcessConfiguration(ref config);
            //mapping based on namespace of a class.
            Type[] typelist = this.GetTypesInNamespace(Assembly.GetAssembly(typeof(MyClassMap)), "ParametersModel.Mappings");
 
            foreach (var type in typelist)
            {
                Fluently.Configure(config).Mappings(m => m.FluentMappings.Add(type)).BuildConfiguration();
            }
 
            //mapping with concrete classes
            //Fluently.Configure(config).Mappings(m => m.FluentMappings
            //    .Add(typeof(CurrencyMap))
            //    .Add(typeof(CountryMap)))
            //    .BuildConfiguration();
 
            //fluent configuration with mapping based on FluentNhibernateMappingAssemblies from xml.
            //Fluently.Configure(config).Database(
            //IfxOdbcConfiguration
            //    .Informix
            //    .ConnectionString(connstr => connstr.FromConnectionStringWithKey("database"))
            //    .Driver()
            //    .Dialect()
            //    .ShowSql().IsolationLevel(System.Data.IsolationLevel.ReadUncommitted)
            //    .ProxyFactoryFactory()).Mappings(
            //        m =>
            //        {
            //            foreach (string assemblyName in FluentNhibernateMappingAssemblies)
            //            {
            //                m.FluentMappings.AddFromAssembly(Assembly.Load(assemblyName));
            //            }
            //        }).ExposeConfiguration(cfg => cfg.Properties.Add("current_session_context_class", "thread")).BuildConfiguration();
        }
 
        protected Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
        {
            return assembly.GetTypes().Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal)).ToArray();
        }
    }
}
Przykładowa część pliku konfiguracyjnego spring-config.xml

 
  
  
    The Paramters object definitions for the Data Access Objects.
  
 
  
  
 
  
  
    
    
      
        
        
        
        
        
        
        
        
      
    



Niestety podświetlanie kodu na stronie nie radzi sobie z taką ilością tagów i dlatego pojawia się dziwny wpis entry entry entry

czwartek, 29 września 2011

Integer integerowi nie równy

W C# integer przyjmuje wartość:
int.MinValue = -2,147,483,648
int.MaxValue = 2,147,483,647
Przypuśćmy, że po pewnych obliczeniach w C# dostajemy wynik o wartości int.MinValue(rzecz tak naprawdę, która zdarza się bardzo rzadko gdyż jest uzależniona od różnorodnych danych wejściowych) i wstawiamy ją do bazy danych Informix.
I nagle otrzymujemy komunikat:
System.Data.Odbc.OdbcException: ERROR [22005] [Informix][Informix ODBC Driver] Error in assignment.

W dokumentacji informixa The INTEGER data type stores whole numbers that range from -2,147,483,647 to 2,147,483,647, for 9 or 10 digits of precision. The number 2,147,483,648 is a reserved value and cannot be used


Tak znienacka możemy dostać ciekawy przypadek do przeanalizowania.

poniedziałek, 26 września 2011

LINQ to Entities does not recognize the method

Problem:
LINQ to Entities does not recognize the method ‘Countries’ Last(System.Linq.IQueryable`1)’ method, and this method cannot be translated into a store expression.
Rozwiązanie:
1) Nie wszystkie metody z LINQ zostały zaimplementowany w LINQ to Entities
2) Należy zrzutować dane na Liste lub inną kolekcję i dopiero wykonać operacje Last();
var countries = this._countryRepository.GetAll().ToList(); //metoda GetAll zwraca IQuarable

var c1 = countries.First();

var c2 = countries.Last();
Co fajniejsze First() zostało zaimplementowane LINQ to Entities.