NHibernate in Action – Book Review


Book on Amazon

All summer I meant to read the book “NHibernate In Action”. I finally got around to it, better late than never I guess. In my opinion this book is aimed at higher level programmers such as lead developers or architects. The book does not contain clear step by step examples of how to get NHibernate running. However it does provide in depth conceptual reasoning why anyone would want to use NHibernate along with reference style examples. If you are trying to learn NHibernate  you are better off reading a few online tutorials first and after that read this book so you can understand exactly what NHibernate is doing and how it does it. Below are some book pros & cons, NHibernate links, and chapter summaries.

Pros

Cons

Helpful NHibernate Links

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6


  • Share/Bookmark

Configuring NHibernate in a Multiple Project Layout

I recently had to setup NHibernate in a multiple project c#, asp.net MVC solution. Since most of the tutorials and books only show a basic single project layout I thought I would post an example of how to configure NHiberate with a multi-project solution.

The main problem I had was that my model objects or entity objects were in a separate project than my database access code which contained the .hbm.xml mapping files. When I tried to configure NHibernate with the basic examples I was getting an “NHibernate.MappingException : No persister for: YourClass” exception. I was still getting that exception even after changing the .hbm.xml files to be an “Embedded Resource”. I finally figured out that my .hbm.xml files needed to reference the ModelLayer assebmly and my NHibernate.Cfg.Configuration.AddAssembly() needed to reference the DataAccessLayer assebmly. See screen shots and code examples below for more details.

Solution layout

  • DataAccessLayer
    • Duh. Database code
      • References
        • ModelLayer
  • ModelLayer
    • Model objects
  • MvcAgain (web layer)
    • ASP.Net project
    • References
      • ModelLayer
      • ServiceLayer
  • ServiceLayer
    • Business logic
    • Reusable logic
    • References
      • ModelLayer
      • DataAccessLayer

Model objects Car.cs and CarLot.cs

using System.ComponentModel.DataAnnotations;
namespace MvcAgain.Models {
    public class Car {
        [Required]
        public virtual int Id {get; set;}
        [StringLength(35), Required]
        public virtual string Manufacturer {get; set;}
        [StringLength(35), Required]
        public virtual string Model {get; set;}
        public virtual CarLot Lot {get; set;}
    }
}//end of Car.cs

using Iesi.Collections;
using System.ComponentModel.DataAnnotations;
namespace MvcAgain.Models {
    public class CarLot {
        [Required]
        public virtual int Id { get; protected set; }
        [StringLength(35), Required]
        public virtual string Name { get; protected set; }
        public virtual ISet Cars { get; protected set; }
    }
}//end of CarLot.cs


Car.hbm.xml and CarLot.hbm.xml

These .hbm.xml files are in the DataAccessLayer project, but they reference the ModelLayer assembly.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="ModelLayer"
                   namespace="MvcAgain.Models">
  <class name="MvcAgain.Models.Car" lazy="false" table="cars">
    <id name="Id">
      <generator class="native"/>
    </id>
    <property name="Model"/>
    <property name="Manufacturer"/>
    <many-to-one name="Lot" class="CarLot" column="lotid" not-null="true">
    </many-to-one>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="ModelLayer"
                   namespace="MvcAgain.Models">
  <class name="MvcAgain.Models.CarLot" lazy="false" table="carlots">
    <id name="Id">
      <generator class="native"/>
    </id>
    <property name="Name"/>
    <set name="Cars" inverse="true">
        <key column="lotid"/>
        <one-to-many class="Car"/>
    </set>
  </class>
</hibernate-mapping>


NHibernateSessionFactory.cs (NHibernate configuration code)

using NHibernate.Cfg;
using NHibernate;
namespace MvcAgain.DataAccessLayer {

    public class NHibernateSessionFactory {

        private static ISessionFactory sessionFactory = null;

        private static ISessionFactory SessionFactory {
            get {
                if(sessionFactory == null) {
                    Configuration configuration = new Configuration();
                    configuration.Configure();
                    //note: you must use the name of the assembly
                    //that contains the .hbm.xml mapping files.
                    //For this example NHibernate will load all .hbm.xml files it
                    //finds in the DataAccessLayer assembly
                    configuration.AddAssembly("DataAccessLayer");
                    sessionFactory = configuration.BuildSessionFactory();
                }
                return sessionFactory;
            }
        }

        public static ISession OpenSession() {
            return SessionFactory.OpenSession();
        }
    }//end of class
}//end of namespace


ModelLayer assembly name in the properties pane.



  • Share/Bookmark

ASP.Net MVC Book Review and musings

ASP.Net MVC musings

Book Review – Pro ASP.Net MVC Framework – Steven Sanderson


Book on Amazon
I am a Java, PHP, and .Net developer which may make my opinion worthless to some Microsoft zealots but I thought I would type up my thoughts on this book anyway. Overall I found this book to be a great way to learn ASP.Net MVC. It has great examples and enough background material to bring people new to the MVC pattern up to speed. Below are my pros and cons along with notes on chapters 1-13.

Note about the cover.

One thing I found interesting is that the cover says “Discover the biggest innovation in Microsoft web development since asp.net 1.0″. I find it amusing that something as old as MVC web frameworks can be called an innovation for asp.net development since MVC frameworks are nothing new to web development. Heck they are not even new to ASP.Net development. See MonoRail .

Pros

Cons

Chapter 1

Chapter 2

Chapter 3

  • Gives in depth definition to each part of MVC
  • Gives good definition of entities vs value objects
  • Lists design and pattern best practices
  • Brief discussion of IoC and IoC containers
  • Brief discussion on automated testing and the TDD movement
  • Gives example of creating mock implementations for testing

Chapter 4

  • Goes into medium depth while building a project with unit testing, domain model, and web layer
  • uses LING to SQL for database interactions
  • Sets up IoC with Castle Windsor
  • Shows how to use Nunit and Moq to create unit tests
  • Good definition of TDD and how the author thinks of it as actually BDD (behaviour driven development)

Chapter 5

  • Examples of how to test every part of ASP.Net MVC
  • Shows example of how to only expose an interface in your controller to avoid tying the controller to your business logic implementation

Chapter 6

  • CRuD actions and views are added to the example project
  • Example of username/password authentication
  • Shows how to upload an image through a form field

Chapter 7

  • Detail of asp.net MVC project folder structure
    • Very well done, explains the what/why for each folder
  • Goes over the naming convention which are crucial since ASP.Net MVC follows CoC

Chapter 8

  • Everything you need to know about how url routing works and also how to create links in your application to your controllers/actions

Chapter 9

  • More details on what code belongs in a controller/action
  • More details on how the views are rendered
  • Example of how to use the [Authorize] filter attribute, which is a great way to easily secure your actions individually

Chapter 10

  • Details on how views work specifically how data is passed between layers and tools available to display that data. Specifically the HTML helpers.

Chapter 11

  • Everything you need to know about how to modify and configure how data is retrieved from forms and urls and then binded to action parameters and model objects
  • Validation
    • Author basically suggest using plain c# in the model layer for validation. doesn’t list the re-usability and “all ready done for YOu” benefits of using a validation utility.

Chapter 12

  • Simple examples of how to use the AJAX HTML helpers which includes JQuery.

Chapter 13

  • Demonstrates basics of HTTP requests to help you understand how vulnerable web sites are. Really good reading for less experienced web developers.
    • Gives example of how to fake an http request
    • Gives examples of using tools like firebug and fiddler
    • Details cross-site scripting and html injection
    • Details how one of the previous chapter examples had a vulnerability and how it can be fixed


Book on Amazon

  • Share/Bookmark