Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
18 / 16 / 0
Регистрация: 03.01.2018
Сообщений: 208
Записей в блоге: 1
1

Паттерны? Многократное использование кода

04.01.2018, 12:42. Показов 1129. Ответов 6
Метки нет (Все метки)

У меня есть класс для работы с базами данных.

В классе есть методы, которые отправляют разные запросы к БД.

Методы имеют несколько общих строк кода и структура такая

C#
1
2
3
4
5
6
7
8
9
try
{
    подключение к БД
    [I]действие[/I]
}
catch
{
    вывести имя ошибки
}
Нужно вынести действие над БД и использовать код подключения и отключения от БД многократно через один метод.

Как правильно? Использовать делегаты и передавать в метод делегат? А как быть с параметрами (аргументами функций) в таком случае, если их количество может варьироваться?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2018, 12:42
Ответы с готовыми решениями:

Многократное использование своего кода
Всем привет! Подскажите, кто знает, как без лишнего геморроя использовать свой собственный код...

Многократное использование datatable
public OleDbDataAdapter a; public DataTable t; main.myOleDbCommand.CommandText =...

Многократное использование изображения в приложении
Помогите создать изображение на С#, которое будет использовать несколько раз в разных местах. в...

Многократное использование массива в разных классах
Задача: сгенерировать массив из случайных чисел и использовать его для сортировки различными...

6
1267 / 968 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
04.01.2018, 12:46 2
можно вынести "подключение к бд" в отдельную операцию
например некий GetOpenedConnection() в котором уже будет перехватываться всё что надо
1
18 / 16 / 0
Регистрация: 03.01.2018
Сообщений: 208
Записей в блоге: 1
04.01.2018, 14:38  [ТС] 3
Задача больше носит обучающий характер, какие ещё варианты вы можете предложить?
0
1113 / 920 / 236
Регистрация: 15.06.2012
Сообщений: 3,614
Записей в блоге: 1
04.01.2018, 15:11 4
Лучший ответ Сообщение было отмечено letsmail9 как решение

Решение

ну скажем....

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var worker = new Worker(ex => Console.WriteLine(ex));
            worker.Run(PrintUsers);
        }
 
        static void PrintUsers()
        {
            var users = new UserDao().GetUsers();
            foreach (var user in users)
                Console.WriteLine($"Name = {user.Name} ; LastName = {user.LasName}");
        }
    }
 
    public class Worker
    {
        private readonly Action<Exception> handlerExeption;
 
        public Worker(Action<Exception> handlerExeption)
        {
            this.handlerExeption = handlerExeption;
        }
 
        public void Run(Action action)
        {
            try
            {
                action();
            }
            catch (Exception ex)
            {
                handlerExeption?.Invoke(ex);
            }
        }
    }
 
    public abstract class BaseDAO
    {
        protected virtual string ConnectionStringKey => "MyConnection";
        protected virtual string ConnectionString => ConfigurationManager.ConnectionStrings[ConnectionStringKey].ConnectionString;
        
        protected virtual void ExecuteReader(string query, Action<SqlDataReader> readerHandler)
        {
            using (var connection = new SqlConnection(ConnectionString))
            using (var command = new SqlCommand(query, connection))
            {
                connection.Open();
                using (var reader = command.ExecuteReader())
                    readerHandler(reader);
            }
        }
    }
 
    public class UserDao : BaseDAO
    {
        public List<User> GetUsers()
        {
            var result = new List<User>();
 
            ExecuteReader("SELECT [Name], [LastName] FROM [Users]",
                reader => 
                {
                    while (reader.NextResult())
                        result.Add(new User { Name = reader[0].ToString(), LasName = reader[1].ToString() });
                }
            );
 
            return result;
        }
    }
 
    public class User
    {
        public string Name { get; set; }
        public string LasName { get; set; }
    }
}
0
Эксперт .NET
5335 / 4129 / 1185
Регистрация: 12.10.2013
Сообщений: 11,974
Записей в блоге: 2
04.01.2018, 16:36 5
Лучший ответ Сообщение было отмечено letsmail9 как решение

Решение

Цитата Сообщение от letsmail9 Посмотреть сообщение
вынести действие над БД и использовать код подключения и отключения от БД многократно через один метод.
Через один метод никак не выйдет (при создании полноценного DAL, ведь в нем подразумеваются методы с разным типом возврата).
Но если предположить, что тип возврата-void, то тогда да, возможно. Создать что-то типа построителя команды (на основе общего интерфейса) и передавать его в метод класса. Типа того что ниже. Но лучше писать полноценный DAL, без таких заморочек.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SQLite;
using System.Configuration;
 
namespace ConsoleApplication14 {
    class Program {
        static void Main(string[] args) {
        }
    }
    
    public class InsertUserQueryBuilder : IQueryBuilder {
        User user;
        public InsertUserQueryBuilder(User user) {
            this.user = user;
        }
 
        public SQLiteCommand BuildQuery() {
            string command = "INSERT INTO Users(Name, Age) VALUES (@Name, @Age)";
            SQLiteCommand cmd = new SQLiteCommand(command);
            cmd.Parameters.AddWithValue("@Name", user.Name);
            cmd.Parameters.AddWithValue("@Age", user.Age);
            return cmd;
        }
    }
 
    public class SelectAllUsersQueryBuilder : IQueryBuilder {
        public SQLiteCommand BuildQuery() {
            return new SQLiteCommand("SELECT * FROM Users");
        }
    }
    public interface IQueryBuilder {
        SQLiteCommand BuildQuery();
    }
 
    public class User {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
0
628 / 568 / 165
Регистрация: 17.07.2012
Сообщений: 1,616
Записей в блоге: 1
04.01.2018, 16:46 6
insite2012, только ваш Builder больно похож на фабрику
А с идеей я согласен, инкапсулировать каждый запрос в отдельный класс, вместе с его выполнением. А-ля паттерн Command.
Цитата Сообщение от letsmail9 Посмотреть сообщение
Использовать делегаты и передавать в метод делегат
А делегаты я бы вообще не использовал. Очень они плохо влияют на Объектно-ориентированный дизайн и ясность кода вцелом.
0
Эксперт .NET
5335 / 4129 / 1185
Регистрация: 12.10.2013
Сообщений: 11,974
Записей в блоге: 2
04.01.2018, 16:55 7
Цитата Сообщение от Cupko Посмотреть сообщение
ваш Builder больно похож на фабрику
Cupko, ну типа того.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2018, 16:55

Многократное использование ChromiumConsoleMessage
Привествую. Выцепляю значения переменных из DOM с помощью вывода в консоль значения и обработки его...

Многократное использование nav
Дали ТЗ, в ТЗ надо сверстать шапку сайта, в шапке, на первый взгляд там есть , 2-3 nav... но думая...

Многократное использование курсора
Проблема заключается в следующем: В хранимой процедуре необходимо многократно выбирать данные из...

Многократное использование консольного меню на C++
При создании меню на языке C++ возникла проблема: пункт в меню можно выбрать только один раз при...

Многократное использование Custom View - как
Привет всем, я новичок в андроид с опытом Java и Flash, и после пары дней бития головой об стену...

Как зациклить программу на многократное использование?
Есть код програмы калькулятора, надо с помощю цикла или при нажатии определенной клавиши(как умога...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.