powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
25 сообщений из 151, страница 1 из 7
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026718
SMARTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучал использования NHibernate и паттернов и в итоге пришел к такому коду, это тестовый набросок, хочу подобное использовать в одном солюшене в котором будут два проекта, один в виде сервисов, другой в виде ASP.NET MVC. Задаю вопрос с целью понять, правильно ли я понял эти паттерны, правильно ли их использовал и не лишние ли они вообще и можно было все не усложнять?
Исходный код (в виде одного файла, для запуска необходимы пакеты System.Data.SQLite, NHibernate, NHibernate.Mapping.Attributes):

Код: 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.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
using System;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Mapping.Attributes;
using NHibernate.Tool.hbm2ddl;

namespace NhSQLiteTest
{
    [Class]
    [Serializable]
    public class Product
    {
        [Id(0, Name = "Id", Column = "Id", TypeType = typeof (int))]
        [Generator(0, Class = "identity")]
        public virtual int Id { get; set; }

        [Property]
        public virtual string Name { get; set; }
    }

    internal class Program
    {
        private static void Main()
        {
            using (var uow = new UnitOfWorkFactory().Create())
            {
                var productRepo = new Repository<Product>(uow);
                productRepo.SaveOrUpdate(new Product {Name = "TestRepo"});
            }
            Console.WriteLine("Success!");
            Console.ReadLine();
        }
    }

    public interface IUnitOfWorkFactory
    {
        IUnitOfWork Create();
    }

    public class UnitOfWorkFactory : IUnitOfWorkFactory
    {
        private ISessionFactory _sessionFactory;

        public ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }

        public IUnitOfWork Create()
        {
            return new UnitOfWork(SessionFactory.OpenSession());
        }

        private void BuildSessionFactory()
        {
            var config = new Configuration();

            config.Configure();
            config.AddAssembly(typeof (Product).Assembly);
            HbmSerializer.Default.Validate = true;
            var stream = HbmSerializer.Default.Serialize(typeof (Product).Assembly);
            stream.Position = 0;
            config.AddInputStream(stream);

            new SchemaUpdate(config).Execute(false, true);

            _sessionFactory = config.BuildSessionFactory();
            _sessionFactory.OpenSession();
        }
    }

    public interface IUnitOfWork : IDisposable
    {
    }

    internal class UnitOfWork : IUnitOfWork
    {
        public UnitOfWork(ISession session)
        {
            if (session == null) throw new ArgumentNullException(nameof(session));
            Session = session;
        }

        public ISession Session { get; private set; }

        public void Dispose()
        {
            Session.Dispose();
            Session = null;
        }
    }

    public interface IRepository<T> where T : class
    {
        void SaveOrUpdate(T obj);
    }

    public class Repository<T> : IRepository<T> where T : class
    {
        private readonly UnitOfWork _uow;

        public Repository(IUnitOfWork uow)
        {
            if (uow == null) throw new ArgumentNullException(nameof(uow));
            _uow = uow as UnitOfWork;
            if (_uow == null)
            {
                throw new ArgumentException("Этот репозиторий принимает только единицу работы NHibernate");
            }
        }

        private ISession Session
        {
            get { return _uow.Session; }
        }

        public void SaveOrUpdate(T obj)
        {
            Session.SaveOrUpdate(obj);
        }
    }
}


...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026723
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTi,

зачем же так усложнять... почему IUnitOfWork -- бессмысленная ничего неумеющая хрень? и почему репозиторий, вдруг, решает задачи UOW?

я так понимаю, то что ты назвал «Unit of Work» на самом деле переносчик болезни, т.е. заразы, т.е. ISession?

как только люди паттерны не каверкают. с таким же успехом можно класс Program переименовать в UnitOfWork, а остальное обозвать как в голову взбредёт, смысл не поменяется ни на йоту.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026854
SMARTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

В связи с пониманием, что я все не правильно сделал я и начал эту тему) IUnitOfWork появился в связи с тем, что мне советовали использовать интерфейсы, так же он был нужен когда я использовал EF и там нужно было сохранять изменения, так же здесь можно сделать транзакции, но сейчас я их проигнорировал для упрощения. Теперь более конкретные вопросы. А разве это не задача UnitOfWork нести в себе подключение к БД и управлять им (создавать, уничтожать)?
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026856
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTiА разве это не задача UnitOfWork нести в себе подключение к БД и управлять им (создавать, уничтожать)?Нет. Эту задачу лучше возложить на DI-контейнер.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026868
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTiтак же здесь можно сделать транзакции, но сейчас я их проигнорировал для упрощенияТо есть Вы проигнорировали суть паттерна.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026888
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTiА разве это не задача UnitOfWork нести в себе подключение к БД и управлять им (создавать, уничтожать)?Задача UnitOfWork - отследить изменения и зафиксировать их в рамках единой транзакции, либо откатить всё.

У Вас Nhibernate, там уже есть реализация ISession. Вам только нужно начать транзакцию (BeginTransaction) и реализовать Commit и Rollback.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39026889
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029144
SMARTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУ Вас Nhibernate, там уже есть реализация ISession. Вам только нужно начать транзакцию (BeginTransaction) и реализовать Commit и Rollback.
Спасибо за ответ, я еще изучаю ту ссылку которые вы дали. Пока получилось вот так вот, это больше похоже на то что надо?
Код: 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.
    public interface IUnitOfWork : IDisposable
    {
        bool InTransaction { get; }

        IGenericTransaction BeginTransaction(IsolationLevel? isolationLevel = null);
    }
------
    internal class UnitOfWork : IUnitOfWork
    {
        public UnitOfWork(ISession session)
        {
            if (session == null) throw new ArgumentNullException(nameof(session));
            Session = session;
        }

        public ISession Session { get; private set; }

        public void Dispose()
        {
            Session.Dispose();
            Session = null;
        }

        public bool InTransaction
        {
            get { return Session.Transaction.IsActive; }
        }

        public IGenericTransaction BeginTransaction(IsolationLevel? isolationLevel = null)
        {
            if (isolationLevel == null)
            {
                return new GenericTransaction(Session.BeginTransaction());
            }
            return new GenericTransaction(Session.BeginTransaction(isolationLevel.Value));
        }
    }
------
    public interface IGenericTransaction : IDisposable
    {
        void Commit();
        void Rollback();
    }
------
    public class GenericTransaction : IGenericTransaction
    {
        private readonly ITransaction _transaction;

        public GenericTransaction(ITransaction transaction)
        {
            if (transaction == null) throw new ArgumentNullException(nameof(transaction));
            _transaction = transaction;
            _transaction.Begin();
        }

        public void Dispose()
        {
            _transaction.Dispose();
        }

        public void Commit()
        {
            _transaction.Commit();
        }

        public void Rollback()
        {
            _transaction.Rollback();
        }
    }


Использование получается вот таким:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        private static void Main(string[] args)
        {
            using (var uow = new UnitOfWorkFactory().Create())
            {
                using (var tran = uow.BeginTransaction())
                {
                    var repo = new Repository<Server>(uow);
                    repo.SaveOrUpdate(new Server {Name = "SERV " + DateTime.Now.TimeOfDay});
                    tran.Commit();
                }
            }
            Console.WriteLine("Success!");
            Console.Read();
        }
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029182
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTi, такое чувство, что Вы дочитали до первого примера кода в статье, типа что-то поняли и принялись писать свой код.

Вышло у Вас совершенно не то, что нужно. Пожалуйста, прочитайте статью внимательно и полностью.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029187
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.: обратите внимание, что там есть жирная ссылка на готовую реализацию UnitOfWork и Repository для NHibernate.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029500
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTiИспользование получается вот таким:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        private static void Main(string[] args)
        {
            using (var uow = new UnitOfWorkFactory().Create())
            {
                using (var tran = uow.BeginTransaction())
                {
                    var repo = new Repository<Server>(uow);
                    repo.SaveOrUpdate(new Server {Name = "SERV " + DateTime.Now.TimeOfDay});
                    tran.Commit();
                }
            }
            Console.WriteLine("Success!");
            Console.Read();
        }



чёза????....
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029916
SMARTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

А чем плох метод SaveOrUpdate?
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029934
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вы чего?

Признайтесь уже себе, что в 99.9999% никакой замены СУБД или ORM в вашем проекте и не планируется и репозитории никому не пригодятся. И что для всей CRUD-подсистемы вы может и напишете с десяток тестов -- по всем правилам, с моками и стабами -- а потом новые писать станет лень, старые покроются плесенью и будут закомментированы. А вы будете ругаться, продираясь через изо всех щелей текущие абстракции фабрик репозиториев юнит-оф-ворков с хитрыми лайфтаймами.

Не надо всего этого; делайте максимально просто.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029961
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTihVostt,

А чем плох метод SaveOrUpdate?

Тем, что сидит в репозитории.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029963
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучНе надо всего этого; делайте максимально просто.

Вредные советы раздаешь?
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39029999
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНахлобучНе надо всего этого; делайте максимально просто.
Вредные советы раздаешь?
Истинно вам говорю!
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030045
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучПризнайтесь уже себе, что в 99.9999% никакой замены СУБД или ORM в вашем проекте и не планируется и репозитории никому не пригодятся.

Весьма распространённое заблуждение, что репа нужна для замены СУБД
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030093
SMARTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучПризнайтесь уже себе, что в 99.9999% никакой замены СУБД или ORM в вашем проекте и не планируется и репозитории никому не пригодятся.
В чем признаваться, это тестовый проект и я просто пытаюсь научиться писать правильно.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030104
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTiНахлобучПризнайтесь уже себе, что в 99.9999% никакой замены СУБД или ORM в вашем проекте и не планируется и репозитории никому не пригодятся.
В чем признаваться, это тестовый проект и я просто пытаюсь научиться писать правильно.
Нахлобуч все правильно говорит... Но вы же "научившись" в боевой код это потащите... бездумно...
Правильно это следовать заветам Оккама... ну и помнить о принципах до сих пор модного аджайла - KISS & YAGNI
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030110
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SMARTiНахлобучПризнайтесь уже себе, что в 99.9999% никакой замены СУБД или ORM в вашем проекте и не планируется и репозитории никому не пригодятся.
В чем признаваться, это тестовый проект и я просто пытаюсь научиться писать правильно.
Мое "воззвание" было адресовано в основном советчикам.

Что касается обучения, то -- к сожалению или к счастью -- в нашей отрасли нет ничего абсолютно правильного, как, например, в физике и математике. Есть какие-то решения и подходы, являющиеся компромиссами и правильные в данном конкретном месте.

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

Одно из самых главных умений разработчика -- это умение есть слонов по кусочкам, то есть умение разбивать большую проблему на ряд мелких, ad infinitum. Не давайте "запрограммировать себя в угол". Не гонитесь за многомудрыми евангелистами от энтерпрайза. Не бойтесь экспериментировать и ошибаться. Старайтесь отдавать предпочтение простым решениям.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030120
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser, Нахлобуч,

Ни разу с вами обоими не согласен.

Призываю вас прекращать раздавать глупые советы направо и налево.

А теперь поцитируем:

buserНо вы же "научившись" в боевой код это потащите... бездумно...

А куда ещё свои знания и опыт тащить? К бабульке на чердак? На свалку? Вы хоть перечитывайте что несёте.

buserПравильно это следовать заветам Оккама...

Звучит настолько же глупо, как «Правильно это поступать правильно». Бритва Оккама это хороший принцип, но в отрыве от контекста он бесполезен, и даже вреден, как нож без ручки.

buserну и помнить о принципах до сих пор модного аджайла - KISS & YAGNI

Самый сок в принципе KISS состоит в том, что простые вещи делаются сложно. А сложные просто. Чтобы сделать систему простой в использовании, сопровождении и поддержке -- надо постараться, это сложно. А говна накидать большой лопатой -- очень просто, с этим справится даже обезьяна.

То, к чему вы призываете, звучит как -- будь тупорылой обезьяной, не нужны тебе ни паттерны, ни методики, ничего не нужно. Закатываешь рукава и начинаешь говнокодить. Индусы же могут? МОжешь и ты

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

Бред. Для начала разберись с тем, что вообще такое «паттерн». Я подскажу, паттерн -- это выработанные годами, готовые, решения распространённых задач и проблем. А вы призываете человека отказаться от них в пользу... чего? Типа если ты хочешь научиться готовить, не надо тебе пользоваться рецептами -- это ПЛОХО! Ну книжку там конечно прочитай, но не стоит им следовать и готовить по рецептам, так что ли?

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

Отказавшись от изучения паттернов, программист обречён открывать америку множество раз, бессмысленно растрачивая своё время.

НахлобучОдно из самых главных умений разработчика -- это умение есть слонов по кусочкам, то есть умение разбивать большую проблему на ряд мелких, ad infinitum. Не давайте "запрограммировать себя в угол". Не гонитесь за многомудрыми евангелистами от энтерпрайза. Не бойтесь экспериментировать и ошибаться. Старайтесь отдавать предпочтение простым решениям.

Много слов и ни о чём. Какие ещё евангелисты, какие простые решения? Паттерны --- это И ЕСТЬ ГОТОВЫЕ ПРОСТЫЕ РЕШЕНИЯ

В общем, не включайте философов, спуститесь на грешную землю. Сами говорите о простоте и тут же растекаетесь в какие-то филосовские словоформы, говоря сразу обо всём, и ни о чём. Т.е. не помогаете человеку вообще ни чем. Никакой конкретики.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030167
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНахлобучНе надо всего этого; делайте максимально просто.

Вредные советы раздаешь? на git что-ли переходить?
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030175
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAна git что-ли переходить?

Угу
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030189
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучНу вы чего?

Признайтесь уже себе, что в 99.9999% никакой замены СУБД или ORM в вашем проекте и не планируется и репозитории никому не пригодятся. И что для всей CRUD-подсистемы вы может и напишете с десяток тестов -- по всем правилам, с моками и стабами -- а потом новые писать станет лень, старые покроются плесенью и будут закомментированы. А вы будете ругаться, продираясь через изо всех щелей текущие абстракции фабрик репозиториев юнит-оф-ворков с хитрыми лайфтаймами.

Не надо всего этого; делайте максимально просто.+123

Переезд на другую СУБД в перспективе можно ещё допустить, но тут EF может сильно помочь сделать легко переносимое решение. Переезд на другой ORM - это уже за пределами разумного. Ладно ещё, если бы EF не реализовывал UoW, но он реализует.

А тестирование можно организовать и поверх EF, подсунув ему тестовую БД.
...
Рейтинг: 0 / 0
Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
    #39030195
SMARTi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч, buser, hVostt

Спасибо за интересный диалог, внимательно читаю и вникаю) В особенности спасибо hVostt за подробные ответы
...
Рейтинг: 0 / 0
25 сообщений из 151, страница 1 из 7
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Правильно ли исполнены паттерны UnitOfWork и Repository для Nhibernate?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]