вторник, 27 сентября 2011 г.

Трехуровневое приложение за 30 минут

Вчера показывал как создать трехуровневое приложение с транспортом на web-сервисах. Времени заняло это ровно 30 минут, вместе с объяснениями. Так как возник вопрос: а есть ли этот пример в блоге? Решил его добавить.

Итак, под трехуровневым приложением понимаем, систему, включающую базу данных, уровень доступа к данным (здесь же может быть спрятана бизнес-логика) и клиентское приложение.
Как это выглядит:
В качестве базы данных воспользуемся MS SQL сервером, в котором в базу Works я создал следующую табличку:
 Для демонстрации работы через хранимые процедуры, добавим процедуру выборки и процедуру удаления работы по ее Id:

CREATE PROCEDURE man_Work_Sel_All AS
BEGIN
    SELECT * from Work
END
и

CREATE PROCEDURE man_Work_Del_Id
    @p_Id int
AS
BEGIN
    delete Work where ID_Work = @p_Id
END
 Теперь собственно к программной части.
Создадим 3 проекта: уровень доступа к данным (dll), уровень бизнес-логики, он же публикации данных (web-сервис) и клиентское приложение (Console Application).
Итак, начнем с dll.
Создаем Class Library (не забыв выбрать Framework 3.5), в котором единственный класс будет иметь вид:

    public static class DataBase
    {
        static string _connectionString = "";

        static DataBase()
        {
            // Строка подключения может быть взята из конфига или еще от куда то
            _connectionString = "Data Source=(local);Initial Catalog=Works;Integrated Security=True";
        }

        public static DataSet man_Work_Sel_All()
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                SqlCommand command = new SqlCommand("man_Work_Sel_All", connection);
                command.CommandType = CommandType.StoredProcedure;
                SqlDataAdapter adapter = new SqlDataAdapter(command);
                DataSet result = new DataSet();
                adapter.Fill(result);
                return result;
            }
        }

        public static void man_Work_Del_Id(int p_id)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                SqlCommand command = new SqlCommand("man_Work_Del_Id", connection);
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.Add("@p_Id"SqlDbType.Int);
                command.Parameters["@p_Id"].Value = p_id;
                try
                {
                    connection.Open();
                    command.ExecuteNonQuery();
                }
                finally
                {
                    if (connection.State == ConnectionState.Open)
                    {
                        connection.Close();
                    }
                }

            }
        }
    }

Создаем ASP .Net Web Service Application (а этот тип проектов поддерживает только framework 3.5, и именно по этой причине, dll должна быть тоже версии 3.5). Добавляем ссылку на проект с DAL-ом, и пишем перевызов методов:
 
        [WebMethod]
        public DataSet man_Work_Sel_All()
        {
            return DataBase.man_Work_Sel_All();
        }
 
        [WebMethod]
        public void man_Work_Del_Id(int p_id)
        {
            DataBase.man_Work_Del_Id(p_id);
        }
После того, как написали, не забываем сделать его StartUp приложением и запустить, скопировав в буфер обмена строку подключения к нашему сервису.У меня это "http://localhost:2335/Service1.asmx".
Создаем третий проект Console Application (версия framework должна быть не меньше 3.5).
В  нем, добавляем Service Reference на наш web-сервис. Имя для namespace я дал DataBase. Помните что строка подключения у нас в буфере?
Итак, класс Program может иметь вид:

    class Program
    {
        static void Main(string[] args)
        {
            DataBase.Service1SoapClient client = new DataBase.Service1SoapClient();
            ShowWorks(client);
            Console.WriteLine("-------------");
            client.man_Work_Del_Id(6);
            ShowWorks(client);
            Console.ReadKey();
        }
 
        private static void ShowWorks(DataBase.Service1SoapClient client)
        {
            DataSet ds = client.man_Work_Sel_All();
            foreach (DataRow item in ds.Tables[0].Rows)
            {
                Console.WriteLine("{0} {1} {2}", item[0], item[1], item[2]);
            }
        }
    }
 Делаем наше приложение StartUp и после чего наше решение должно принять вид:
 Запускаем, и видим:
 Вот, собственно, и все.

P.s. при следующем открытии Visual Studio консольное приложение будет падать с ошибкой. т.к. не будет видеть web-сервиса. Для того чтобы опять заработало есть два варианта:
1. Опять сделать StartUp приложением сервис, запуститься, сделать StartUp клиенту и запустить его.
2.  В свойствах Solution настроить массовый запуск проектов:
должно выглядеть как то так:

Комментариев нет:

Отправить комментарий