powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Repository & Service
25 сообщений из 133, страница 4 из 6
Repository & Service
    #39186802
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GПросмотрел кучу инет страниц об UnitOfWork

что DbContext, что ISession - это уже UnitOfWork. оболочка над ними, думаю, лишнее
...
Рейтинг: 0 / 0
Repository & Service
    #39186860
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G,

Unit Of Work это бизнес-транзакция. Если реализация отвечает этому требованию, всё ок.

Save или Commit в бизнес-транзакции не обязательно только сохраняет данные в БД, могут выполняться и другие действия.

Поэтому связывать Unit of Work и репозиторием -- неправильно, они должны быть независимые.
...
Рейтинг: 0 / 0
Repository & Service
    #39186862
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иммануил Кантчто DbContext, что ISession - это уже UnitOfWork. оболочка над ними, думаю, лишнее

DbContext реализует паттерн UOW, но не является полной бизнес-транзакцией. Если, например, выполнять SQL команду через DbContext, то транзакция на уровне контекста не будет обеспечена. Следовательно считать его полноценным UOW — нельзя, и требуется своя реализация поверх или с использованием DbContext.
...
Рейтинг: 0 / 0
Repository & Service
    #39186867
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G
Код: c#
1.
2.
3.
4.
5.
    public interface IUnitOfWork : IDisposable
    {
        IApplicationRepository ApplicationRepository { get; }
        void Commit();
    }


И где Вы такие странные примеры находите?

Смотрим Фаулера :


Смотрим MSDN :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface IUnitOfWork
{
    void MarkDirty(object entity);
    void MarkNew(object entity);
    void MarkDeleted(object entity);

    void Commit();
    void Rollback();
}



Смотрим пример реализации на их основе .
...
Рейтинг: 0 / 0
Repository & Service
    #39187719
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

А не где нельзя увидеть реализацию методов и их применение ? По ссылкам этого нет (
В инете ни чего подобного не встречал...
Может Вы можете поделиться ссылкой на удачную статью / пример?
...
Рейтинг: 0 / 0
Repository & Service
    #39187723
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пожалуйста не могли бы вы взглянуть на вариант вот по этой ссылке
Там второй пример для EF. Это реализовано по Фаулеру?
Смущает класс ContextFactory, который содержит следующую строчку
Код: c#
1.
DbContext context = HttpContext.Current.Items["CurrentContext"] as DbContext;
...
Рейтинг: 0 / 0
Repository & Service
    #39188443
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GПожалуйста не могли бы вы взглянуть на вариант вот по этой ссылке
Там второй пример для EF. Это реализовано по Фаулеру?
Смущает класс ContextFactory, который содержит следующую строчку
Код: c#
1.
DbContext context = HttpContext.Current.Items["CurrentContext"] as DbContext;



какая-то бесполезная прослойка
...
Рейтинг: 0 / 0
Repository & Service
    #39188701
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAАртем G
Код: c#
1.
2.
3.
4.
5.
    public interface IUnitOfWork : IDisposable
    {
        IApplicationRepository ApplicationRepository { get; }
        void Commit();
    }


И где Вы такие странные примеры находите?

Смотрим Фаулера :


Смотрим MSDN :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface IUnitOfWork
{
    void MarkDirty(object entity);
    void MarkNew(object entity);
    void MarkDeleted(object entity);

    void Commit();
    void Rollback();
}



Смотрим пример реализации на их основе .

при такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?
...
Рейтинг: 0 / 0
Repository & Service
    #39188805
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем Gпри такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?С чего Вы это взяли? Вы так и не поняли для чего нужен Repository, а для чего UnitOfWork?
...
Рейтинг: 0 / 0
Repository & Service
    #39188874
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
DbContext реализует паттерн UOW, но не является полной бизнес-транзакцией. Если, например, выполнять SQL команду через DbContext, то транзакция на уровне контекста не будет обеспечена. Следовательно считать его полноценным UOW — нельзя, и требуется своя реализация поверх или с использованием DbContext.
Почему это не будет? Для каждой атомарной команды будет одна неявная транзакция.
...
Рейтинг: 0 / 0
Repository & Service
    #39188982
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAАртем Gпри такой реализации Unit Of Work в репозиториях не требуется реализация add, edit, delete?С чего Вы это взяли? Вы так и не поняли для чего нужен Repository, а для чего UnitOfWork?

Я пытаюсь разобраться... вариантов в интернете с десяток ... разобраться какие из них наиболее верные нужно положить 1 человеку кучу сил / времени. Я 1. Мне не кому подсказать. Единственное место - это вот этот форум.

Далее по проблеме. Спорить с Мартином я не буду. Говорит что нужно так значит так.
Смотрю на UML Мартина и начинаю гуглить реализацию. Единственное на что наткнулся вот на эту статью: линк . Она ближе всех. В спойлерах тоже самое что по линку, но на моем проекте.
1 При таком вот подходе смысл иметь add, edit, remove в репозитории отпадает напрочь. 2. Нужны Ваши коментарии, что ни так. 3. Мне бы боевой пример на одном классе ... потому как сам я до пенсии правильного решения не найду ((

Service
Код: 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.
    public interface IUserService
    {
        void AddAsGuest(IIdentity Identity);
    }
    public class UserService : IUserService
    {
        private readonly IApplicationsStoreUnitOfWork unitOfWork;
        private readonly IUserRepository userRepository;
        private readonly IRoleRepository roleRepository;
        private readonly IMapper mapper;
        public UserService(IApplicationsStoreUnitOfWork unitOfWork, IUserRepository userRepository, IRoleRepository roleRepository, IMapper mapper)
        {
            this.unitOfWork = unitOfWork;
            this.userRepository = userRepository;
            this.roleRepository = roleRepository;
            this.mapper = mapper;
        }
        public void AddAsGuest(IIdentity Identity)
        {
            try
            {
                var role = roleRepository.GetRole(RoleType.Guest.ToString());
                if (role == null)
                {
                    role =  new Domain.SecurityPolicies.Role
                    {
                        Name = RoleType.Guest.ToString()
                    };
                    unitOfWork.RegisterNew(role);
                }
                var user = new Domain.SecurityPolicies.User
                {
                    FirstName = Identity.FirstName(),
                    LastName = Identity.LastName(),
                    IdentityId = Identity.IdentityId(),
                    Email = Identity.Email(),
                    Roles = new[] {role}
                };
                unitOfWork.RegisterNew(user);
                unitOfWork.Commit();
            }
            catch (Exception)
            {
                unitOfWork.Rollback();
            }
        }
    }

UoW
Код: 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.
public abstract class UnitOfWorkBase<TContext> : IUnitOfWork<TContext> where TContext : DbContext
    {
        private readonly TContext dbContext;
        private readonly List<object> registredNew = new List<object>();
        private readonly List<object> registredDirty = new List<object>();
        private readonly List<object> registredRemoved = new List<object>();
        protected UnitOfWorkBase(IContextFactory<TContext> contextFactory) : this(contextFactory.CreateDbContext())
        {
            dbContext = contextFactory.CreateDbContext();
        }
        protected UnitOfWorkBase(TContext dbContext)
        {
            this.dbContext = dbContext;
        }
        public void RegisterNew(object entity)
        {
            registredNew.Add(entity);
        }
        public void RegisterDirty(object entity)
        {
            registredDirty.Add(entity);
        }
        public void RegisterRemoved(object entity)
        {
            registredRemoved.Add(entity);
        }
        public void Commit()
        {
            using (var transaction = new TransactionScope())
            {
                foreach (var entity in registredNew)
                    dbContext.Entry(entity).State = EntityState.Added;
                foreach (var entity in registredDirty)
                    dbContext.Entry(entity).State = EntityState.Modified;
                foreach (var entity in registredRemoved)
                    dbContext.Entry(entity).State = EntityState.Deleted;
                dbContext.SaveChanges();
                transaction.Complete();
            }
        }
        public void Rollback()
        {
            registredNew.Clear();
            registredDirty.Clear();
            registredRemoved.Clear();
        }
    }


...
Рейтинг: 0 / 0
Repository & Service
    #39189389
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttАртем G,
Unit Of Work это бизнес-транзакция. Если реализация отвечает этому требованию, всё ок.
Save или Commit в бизнес-транзакции не обязательно только сохраняет данные в БД, могут выполняться и другие действия.
Поэтому связывать Unit of Work и репозиторием -- неправильно, они должны быть независимые.
hVostt, посмотрите пожалуйста, то что у меня под спойлерами в предыдущем посте. Сейчас у меня в примере UoW не содержит репозиториев, а в Service видно как используется репозиторий и UoW. Я был бы очень признателен если бы Вы ответили в правильном ли я направлении двигаюсь + любые замечания приветствуются :).
...
Рейтинг: 0 / 0
Repository & Service
    #39189475
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем G,
Забей, тебе сам Фаулер не ответит, либо даст такой расплывчатый ответ, что сам тот кто его сподвиг на все это не поймет. Писать всякие книжки - его хлеб, он в бренде, покупают.

P. S. нафига очищать листы в Rollback?
...
Рейтинг: 0 / 0
Repository & Service
    #39189486
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВАртем G,
Забей, тебе сам Фаулер не ответит, либо даст такой расплывчатый ответ, что сам тот кто его сподвиг на все это не поймет. Писать всякие книжки - его хлеб, он в бренде, покупают.

P. S. нафига очищать листы в Rollback?
В сервисе заполняется registredNew
Код: c#
1.
2.
 Сервис
unitOfWork.RegisterNew(role);

Код: c#
1.
2.
3.
4.
        public void RegisterNew(object entity)
        {
            registredNew.Add(entity);
        }

Код: c#
1.
private readonly List<object> registredNew


Если коммит то
Код: c#
1.
2.
 foreach (var entity in registredNew)
                    dbContext.Entry(entity).State = EntityState.Added;


Если эксепшен то список registredNew чистится.
...
Рейтинг: 0 / 0
Repository & Service
    #39189488
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GЕсли эксепшен то список registredNew чистится.
И потом используется еще раз?
А если не exeption то не чистится и используется еще раз?
Чем это отличается от добавления просто в dbContext.Entry?
...
Рейтинг: 0 / 0
Repository & Service
    #39189552
Артем G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВАртем GЕсли эксепшен то список registredNew чистится.
И потом используется еще раз?
А если не exeption то не чистится и используется еще раз?
Чем это отличается от добавления просто в dbContext.Entry?
Да согласен, можно списки убрать. Нужно будет подумать только как делать RollBack.
Вот видете даже в простых вещах выложено не продуманно / криво.
...
Рейтинг: 0 / 0
Repository & Service
    #39189639
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Артем GНужно будет подумать только как делать RollBack.
Код: c#
1.
2.
3.
4.
public void Rollback()
{
    dbContext = contextFactory.CreateDbContext();
}



зы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо?
...
Рейтинг: 0 / 0
Repository & Service
    #39189642
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так:
Код: c#
1.
2.
3.
4.
5.
public void Rollback()
{
    dbContext.Dispose();
    dbContext = contextFactory.CreateDbContext();
}
...
Рейтинг: 0 / 0
Repository & Service
    #39189662
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо?

1. Для тестирования
2. Для гибкости (не всё в последствии может храниться в одной SQL базе данных)
3. Для расширения (между EF и репой можно организовать свой слой умного кеша)
4. Абстрагирование от способа хранения данных улучшает архитектуру на порядки
5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper
6. Для масштабирования

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

Как говориться, нет смысла для собачей будки привлекать инженеров и рисовать чертежи. Взял молоток, гвозди -- и вперёд.
...
Рейтинг: 0 / 0
Repository & Service
    #39189777
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей Кзы: Откуда такое непреодолимое желание иметь независимость прикладного кода от EF? Неужели вероятность отказа от EF настолько высока? В противном случае накой это всё надо?

1. Для тестирования
2. Для гибкости (не всё в последствии может храниться в одной SQL базе данных)
3. Для расширения (между EF и репой можно организовать свой слой умного кеша)
4. Абстрагирование от способа хранения данных улучшает архитектуру на порядки
5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper
6. Для масштабирования

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

Как говориться, нет смысла для собачей будки привлекать инженеров и рисовать чертежи. Взял молоток, гвозди -- и вперёд.Да ты "Эффективный архитектор 80 LVL", не меньше!

А ещё есть мнение, что проще всего наплодить безумных архитектурных решений, а ту же систему в простой и прозрачной архитектуре реализовать гораздо сложнее.
...
Рейтинг: 0 / 0
Repository & Service
    #39189803
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КДа ты "Эффективный архитектор 80 LVL", не меньше!

А ещё есть мнение, что проще всего наплодить безумных архитектурных решений, а ту же систему в простой и прозрачной архитектуре реализовать гораздо сложнее.
Любую архитектурную проблему можно решить введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества абстрактных слоев! (С)
...
Рейтинг: 0 / 0
Repository & Service
    #39189873
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper

Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга.
...
Рейтинг: 0 / 0
Repository & Service
    #39189874
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кв простой и прозрачной архитектуре

буттон_клик?
...
Рейтинг: 0 / 0
Repository & Service
    #39189877
Владимир Путин-Ленин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVostt5. Возможность заменить EF на другой ORM в критических к производительности местах, например, на Dapper

Тут правильней сразу смотреть в сторону старого доброго датаридера и ручного маппинга.

а потом написать самодельный ОРМ, который потом заменить на нормальный.
...
Рейтинг: 0 / 0
Repository & Service
    #39189901
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Путин-ЛенинАлексей Кв простой и прозрачной архитектуре

буттон_клик?Да, если нет причин для усложнения.
...
Рейтинг: 0 / 0
25 сообщений из 133, страница 4 из 6
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Repository & Service
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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