Minimal DAL and POCO mapping — Максимальный минимум с Fluent ADO .NET

На этот раз мы подойдем к мэппингу POCO объектов несколько с другой стороны. Бывают ситуации, когда вы не должны использовать ORM по тем или иным причинам, например — пожелание заказчика или какие то другие факторы (например, разработка для мобильных устройств).

Что делать в этом случае? Остается один лишь ADO .NET с нашими любимыми DbCommand и DbConnection.

А вот и есть выход! Легковесная библиотека, позволяющая использовать некоторые преимущества ORM мэппинга без использования непосредственно ORM.

Имя ей — Fluent Ado.NET. Знакомьтесь!

Официальная страничка этого чуда на Codeplex: fluentado.codeplex.com

Исходный код можно взять здесь через SVN: FluentAdo.svn.codeplex.com/svn

Компилим скачанные исходники. Если при компиляции возникнут ошибки — советую удалть из солюшена ссылки на проекты тестов и сделать ребилд снова.

Что мы имеем внутри солюшена? Четыре проекта:

* FluentAdo.Generic

* FluentAdo.Oledb

* FluentAdo.Oracle

* FluentAdo.SQLite

Мне по нраву пришелся первый 🙂

По большому счету в исходниках написаны шаблоны, которые вы без труда сможете продублировать в своем основном проекте. Однако есть возможность использовать ссылку готовую библиотеку, подключив к проекту. Ниже мы рассмотрим второй вариант.

Весь синтаксис SQL будет отныне находиться под вашим бдительным взором, вы не должны пропустить ни единого поля. Чаще всего вы будете иметь дело с классом FluentCommand<>, который выполняет SQL запрос и производит мэппинг результатов. Команде нужно будет указать явно соединение примерно так:

SqlConnection myConnection = new SqlConnection(myConnectionString);

FluentCommand cmd = new FluentCommand();
cmd.SetConnection(myConnection);

Классы из DAL останутся теми же (POCO):

public class Product
    {
        public string Code { get; set; }
        public int ProductNumber { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }
        
        
public class Order
    {
        public int OrderNumber { get; set; }
        public string Comment { get; set; }
        public DateTime Date { get; set; }
       
        public int Count { get; set; }
        public Customer Customer { get; set; }

        public Product Product { get; set; }
    }

А чтобы осуществить выборку из базы (конечно, база должна быть создана), нужно написать следующее:

public static Product GetProductByNumber(int number)
        {
            SqlConnection myConnection = GetSqlConnection();

            string sql = "select Code, ProductNumber, Name, Price from Product where ProductNumber = @ProductNumber";
            return new FluentCommand(sql)
                .SetConnection(myConnection)
                .AddInt("ProductNumber", number)
                .SetMap(x => new Product
                            {
                                Code = x.GetString("Code"),
                                Name = x.GetString("Name"),
                                ProductNumber = x.GetInt("ProductNumber"),
                                Price = x.GetValue("Price"),
                            })
                .AsSingle();

            
        }


        public static List GetProductList()
        {
            SqlConnection myConnection = GetSqlConnection();

            string sql = "select Code, ProductNumber, Name, Price from Product";
            return new FluentCommand(sql)
                .SetConnection(myConnection)
                .SetMap(x => new Product
                {
                    Code = x.GetString("Code"),
                    Name = x.GetString("Name"),
                    ProductNumber = x.GetInt("ProductNumber"),
                    Price = x.GetValue("Price"),
                })
                .AsList();

        }

Здесь мы опустили GetSqlConnection, потому что он это к делу не относится 😉

Есть еще много над чем подумать, например, каскадная загрузка таблиц (Product <-> Order), как мы делали это при использовании Fluent NHibernate.

Но в общем и целом технология очень удобна, и, если вы не хотите использовать ничего тяжеловесного, а наоборот, хотите получить полный контроль над Sql-командами, выполнением запросов и тп., то FluentAdo .NET — для вас.

Рейтинг
( Пока оценок нет )
Загрузка ...